【发布时间】:2016-10-31 10:28:19
【问题描述】:
我正在编写一个有趣的程序(不是为了学校),并且很难弄清楚为什么 scanf 函数没有在我的循环的每次迭代中执行 - 我已经玩弄了两个“for”循环和“while”循环。
我知道这取决于我如何编写 scanf 函数(即 scanf("%s", &variablename); VS scanf("%99[^\n]s", &variablename);)会有所不同,但我已经尝试了所有方法,但我很绝望!
当我对来自scanf 的输入进行printf 检查时,每次迭代只输入一个字符串,因此如果我在第一个输入中输入两个单词,则需要两次迭代来处理- 每一个字。这是我正在描述的代码段:
int main(void){
int tries = 0;
int score = 0;
char question[100];
char useranswer[100];
const char *phrase = {"our favorite saying\0"};
printf("\nQuestion #3 (10 points): What is our secret saying?\n");
sleep(1);
tries = 1;
while (tries<=3){
printf("YOUR ANSWER:");
scanf("%s[^\n]", useranswer);
if(strncmp(useranswer, phrase, 15) != 0){
printf ("Nope, try again!\n");
printf("You have used %d out of 3 tries!\n", tries);
if (tries == 2){
printf("Here's your final hint:xxx...\n");
}
if (tries == 3){
printf("You didn't get it. The answer is: our favorite saying!\n");
}
tries++;
}
if (strncmp(useranswer, phrase, 15) == 0){
printf("Damn, you're good. Well done.\n");
score += 10;
break;
}
}
这段代码的输出是:
Question #3 (10 points): What is our secret saying?
YOUR ANSWER:our favorite saying
Nope, try again!
You have used 1 out of 3 tries!
YOUR ANSWER:Nope, try again!
You have used 2 out of 3 tries!
Here's your final hint:xxx...
YOUR ANSWER:Nope, try again!
You have used 3 out of 3 tries!
You didn't get it. The answer is: our favorite saying!
(它只允许我输入一次,然后我输入了“我们最喜欢的说法”。)
【问题讨论】:
-
scanf("%99[^\n]%*c", useranswer); -
[...]不是s说明符的附加组件...它本身就是一个不同的格式说明符。%s读取下一个非空白字符字符串,%[^\n](not%s[^\n]) 读取除\n之外的任何字符的字符串——所以你刚刚读取的代码每个一次一个字(每个循环一个)。 -
"%s[^\n]"不是有效的scanf()格式。建议改用fgets(useranser, sizeof useranswer, stdin)。 -
@chux 为什么无效?
-
@immibis Ahhh 是的
"%s[^\n]"是 有效,但肯定没有用,也肯定不是 OP 所希望的。"%s[^\n]"会 1a) 扫描空白 - 将它们扔掉,1b) 扫描非空白 - 将结果保存在useranswer,可能会过度填充,1c) 遇到 EOF 或空白并将其放入回到stdin2) 扫描并尝试将[与前一个空格匹配并失败,结束扫描。很好的收获。
标签: c for-loop printf scanf strcmp