scanf没有被调用

问题描述 投票:1回答:2

我试图多次使用scanf读取整行,由于某些原因它只能在第一次使用。第二次循环运行时,编译器会忽略scanf函数

这是我的代码:

#include <stdio.h>
int main()
{
    char msg[100];
    char to[100];
    while (1)
    {
        printf("[]:Msg to ? :");
        scanf("%s", to);
        printf("[]:Msg: ");
        scanf("%99[^.]", msg);
        printf("Sending %s\n", msg);
    }
    return 0;
}

这是我给出的输出:

[]:Msg到? :他[]:Msg:你好先生他!发送你好先生

他! []:Msg到? :[]:消息:

在这里,我希望能够将变量更改为...在%s之前添加空格由于某种原因在这里没有效果

c linux
2个回答
1
投票

问题出在这里:

scanf("%99[^.]", msg);

此语句最多可读取99个字符,但只能读取下一个不匹配的字符。现在,如果你把

先生,他好!

进入输入缓冲区,你确实有

"Hello mister him!.\n"

在stdin输入流缓冲区中。现在,scanf处理所有内容(但不包括)点,因此点和换行符保留在输入缓冲区中。接下来打电话给scanf()

scanf("%s", to);

现在从输出缓冲区中取出点和换行符,自动结束下一行读取。现在输入缓冲区为空,以下scanf等待下一条消息。

要解决此问题,您可以跳过点和换行符,如下所示:

scanf("%99[^.]", msg);
getchar(); // Pacman (Eat the dot)

并在另一个scanf使用

// scanf(" %s", to); // Skip the preceding newline

(正如H.S.指出的那样,这是不必要的)

请注意,输入消息> 99个字符的情况尚未正确处理。


0
投票

如果要使用scanf读取整行,可以使用%[^ \ n]而不是%99 [^。]。如果在使用%[^ \ n]扫描之前按下任何'enter',请务必添加getchar()。代码中显示的更改可能有用:

while (1)
{
    printf("[]:Msg to ? :");
    scanf("%[^\n]", to);
    getchar();
    printf("[]:Msg: ");
    scanf("%[^\n]", msg);
    getchar();
    printf("Sending %s\n", msg);
}
© www.soinside.com 2019 - 2024. All rights reserved.