scanf没有接到电话
我尝试使用scanf多次阅读整行内容,由于某些原因,它只在第一次使用时起作用。 循环第二次运行时,编译器将忽略scanf函数 这是我的密码:scanf没有接到电话,c,linux,C,Linux,我尝试使用scanf多次阅读整行内容,由于某些原因,它只在第一次使用时起作用。 循环第二次运行时,编译器将忽略scanf函数 这是我的密码: #include <stdio.h> int main() { char msg[100]; char to[100]; while (1) { printf("[]:Msg to ? :"); scanf("%s", to);
#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;
}
#包括
int main()
{
char-msg[100];
char到[100];
而(1)
{
printf(“[]:Msg to?:”);
扫描频率(“%s”,至);
printf(“[]:Msg:”);
scanf(“%99[^.]”,msg);
printf(“发送%s\n”,消息);
}
返回0;
}
这是我给出的输出:
[]:Msg to?:他[]:Msg:你好,他先生!。向您问好,先生
他![]:Msg to?:[]:Msg:
在这里,我希望能够将变量更改为。。。
由于某种原因在%s之前添加空格在此处无效问题在于:
scanf("%99[^.]", msg);
此语句最多可读取99个字符,但只能读取到下一个不匹配的字符。现在如果你把
你好,他先生
在输入缓冲区中,确实有
"Hello mister him!.\n"
在stdin输入流缓冲区中。现在,scanf处理直到(但不包括)点的所有内容,因此点和换行符保留在输入缓冲区中。下一次调用scanf()
现在从输出缓冲区获取点和换行符,这将自动结束下一行的读取。现在输入缓冲区为空,下面的scanf将等待下一条消息
要解决此问题,可以跳过点和换行符,如下所示:
scanf("%99[^.]", msg);
getchar(); // Pacman (Eat the dot)
而在另一个scanf使用中
(正如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);
}
在@JonathonReinhart前面添加一个空格问题不同,在这种情况下,空格没有任何用处,至少它没有效果:/I尝试使用%s而不是99,但是它分别读取每个单词,并且它运行了几次循环来打印所有printf,但仍然跳过scanf:/注意,您不需要在
%s
-->scanf(“%s”),之前放置空格
,%s
格式说明符跳过所有空格。OP可能希望在%99[^.]'
之前有一个“
”,以使用先前的扫描(“%s”,to)代码>留下的尾随空白。scanf(“%[^\n]”,to)当输入行为“\n”
时,1)无法将任何内容读入至
,使至
处于未初始化状态。2) 缺少像%99[^\n]“
这样的宽度会将此代码视为坏代码get()
。
// scanf(" %s", to); // Skip the preceding newline
while (1)
{
printf("[]:Msg to ? :");
scanf("%[^\n]", to);
getchar();
printf("[]:Msg: ");
scanf("%[^\n]", msg);
getchar();
printf("Sending %s\n", msg);
}