我试图多次使用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之前添加空格由于某种原因在这里没有效果
问题出在这里:
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个字符的情况尚未正确处理。
如果要使用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);
}