Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf没有接到电话_C_Linux - Fatal编程技术网

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);

我尝试使用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;
}
#包括
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);
}