C——scanf和FGET似乎都没有执行
我似乎无法让这两个函数使用此代码执行任何操作。我99%确信我的格式是正确的,并且我已经对函数本身进行了多次测试。似乎只有在这里我才有问题 如果这是一个愚蠢的问题,我道歉;如果是,我会删除它。我还删除/修改了与问题无关的代码,如果这种组织方式看起来很奇怪的话 使用FGET:C——scanf和FGET似乎都没有执行,c,scanf,fgets,C,Scanf,Fgets,我似乎无法让这两个函数使用此代码执行任何操作。我99%确信我的格式是正确的,并且我已经对函数本身进行了多次测试。似乎只有在这里我才有问题 如果这是一个愚蠢的问题,我道歉;如果是,我会删除它。我还删除/修改了与问题无关的代码,如果这种组织方式看起来很奇怪的话 使用FGET: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> char name
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
char name[50];
char yesno;
void sleep() {
printf("Try again? (y/n)\n" );
scanf("%s", &yesno);
if (yesno == 'y') {
puts("Name?");
fgets(name,50,stdin);
printf("Name is %s\n", name);
}
else {
printf("Null");
}
}
int main() {
puts("Begin? y/n");
scanf("%s", &yesno);
if (yesno == 'y') {
sleep();
}
}
一旦执行到这一点
以scanf替代fgets
scanf("%[^\n]s", name);
同样的问题也发生了。奇怪的是
scanf("%s", name);
工作正常,但显然只扫描到空白处。您需要清除缓冲区,因为当您
fgets(name,50,stdin)时\n会有缓冲区
您只需读取上一次输入的\n(当您输入y并按enter键时,enter键为\n),因此您需要先读取它,然后再读取另一个单词,为此,一种简单的方法是添加getchar()代码>前fgets(名称,50,标准输入)代码>并且工作正常。但是当你的缓冲区中有很多字符时(在另一个应用程序中),你可以添加这个来清除所有的缓冲区,而((c=getchar())!='\n'&&c!=EOF){}
如果不清楚的话,很抱歉——我没有混合它们;我是说,使用scanf或fgets会导致相同的问题。还是我误解了你?我建议这篇关于@Badda的文章:谢谢你的链接。这是一本很好的读物,对很多人都会有启发。“%s”格式说明符用于字符串,而不是字符。因为yesno
是一个char
,用%s
格式说明符传递地址是没有意义的。
scanf("%s", name);