为什么我在使用scanf和gets时遇到问题?

3
当我试图使用scanf和gets时,我遇到了麻烦,我需要将gets放两次,如果我只放一次,我的程序就会终止,这是我的作业,我必须在这些地方使用这些函数。
代码如下:
int main()  
{
    int i=0,operation=0;
    char str[100];

    printMenu();

    scanf("%d",&operation);

    switch (operation)
    {
        case 1:     
            printf("Please, enter your sentence >");
            gets(str);
            gets(str);

            if (checkChars(str))
                inputSent(str);
            else
                printf("ERROR: Incorrect data, try again.");

            break;
    }   

    return 0;
}

2
使用 gets 会有什么可能出错的地方? - icecrime
你确定你没有在CheckChars()或inputSent()方面遇到问题吗? - GreenMatt
2个回答

1

所以,我们有一个数据的标准输入流。这是您在终端上输入的内容。

当您调用 scanf 时,它只读取您输入的十进制数字。它不会读取其后的换行符。因此,您需要两次调用 gets,因为第一次调用只能看到 '\n',而第二次才能看到您实际的数据。

要解决这个问题,我建议您在获取操作时使用 gets 来读取整行,然后使用 sscanf 来获取操作。

例如:

printMenu();

gets(str)
sscanf(str, "%d", &operation);

switch (operation) {

0
发生的情况是,在第一个 scanf() 之后,输入缓冲区中仍有数据残留(通常是用于分隔字符和单词的任何形式的空格,例如回车键),当你调用下一个 gets() 时,它立即返回,因为它读取了你在输入数字后敲击的“回车”键。
为了解决这个问题,你需要清空输入缓冲区。无论何时在读取单个字符、单词和句子之间切换时,这都是一个好习惯。这是我从其他线程中找到的一个小段代码(放在你的 scanf() 后面):

while (getchar() != EOF);
它的作用是不断地从输入缓冲区中读取字符,直到没有字符剩余。这可能并不是所有情况下的最佳解决方案,但它足以帮助你完成此任务。


1
“while (getchar() != '\n');” 这个更接近于这里所需的内容,不是吗? - Bill Lynch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接