为什么我遇到scanf问题而且得到了?

时间:2010-11-22 22:15:43

标签: c scanf

当我尝试使用scanf并获取时,我遇到了麻烦,我需要把两次得到,如果我把它放到我的程序终止后,这是功课,我必须在那些地方使用这些功能。

代码:

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 个答案:

答案 0 :(得分:1)

因此,我们有一个stdin数据流。这是您在终端上写的输入。

当您拨打scanf时,它只会读取您编写的十进制数。它不会读取后面的换行符。因此,您需要拨打gets两次电话,因为第一个电话只会看到'\n',而第二个电话会看到您的实际数据。

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

例如:

printMenu();

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

switch (operation) {

答案 1 :(得分:0)

在您的第一个scanf()之后发生的事情是,在输入缓冲区中仍然存在数据(任何形式的空白分隔事物,通常是返回),当您调用下一个gets()时它返回立即因为它在输入数字后读取了你输入的“输入”。 为了解决这个问题,您需要刷新输入缓冲区。这是一种很好的做法,特别是在阅读单个字符和句子之间切换时。这是我从另一个可能对你有所帮助的帖子中找到的一个小片段(这可以追溯到你的scanf()):

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