C——scanf和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

我似乎无法让这两个函数使用此代码执行任何操作。我99%确信我的格式是正确的,并且我已经对函数本身进行了多次测试。似乎只有在这里我才有问题

如果这是一个愚蠢的问题,我道歉;如果是,我会删除它。我还删除/修改了与问题无关的代码,如果这种组织方式看起来很奇怪的话

使用FGET:

#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);