如何在c中扫描包含空格的完整行

时间:2017-09-15 18:45:18

标签: c scanf

有没有办法扫描包含空格的完整行并将其存储在一个变量中?

我在网上尝试了很多东西,如:

scanf("%[^\n]s",str);
scanf("%20[0-9a-zA-Z ]", str);
scanf("%20[^\n]", str);

无效。

我有类似的东西:

#include <stdio.h>
#include <stdlib.h>
void main(){

    while (1) {
        int command = 0;
        printf("Enter a command(0-10):");
        scanf("%d", &command);
        switch (command) {
            case 4:
            {
                char message[20];
                printf("Please enter the message:");
                scanf("%s", message);
                break;
            }
        }
    }
}

当我为&#34;命令&#34;输入值4时变量,然后是一些包含&#34; message&#34;的空格的输入。数组像:&#34;你好所有&#34; 然后我进入无限循环,我不知道为什么?

我想到了像scanf(&#34;%s [\ n]&#34;,message);因为我想要阅读,直到我达到一个新的行,但结果更糟(请告诉我这个场景中%s [\ n]的含义,是否与我的想法相同)。

那么如何扫描包含整个行的空格以及scanf(&#34;%s [\ n]&#34;,message)的含义一般是什么?

更新

实际上,我之前尝试过使用fgets,但结果更糟,例如:

#include <stdio.h>
#include <stdlib.h>

void main(){

    while (1) {
        int command = 0;
        printf("Enter a command(0-10):");
        scanf("%d", &command);
        switch (command) {
            case 4:
            {
                char message[20];
                printf("Please enter the message:");
            fgets (message, 20, stdin);
                break;
            }
        }

    }

}

这里的程序正在跳过阅读&#34;消息&#34;,你可以尝试一下吗?有什么我想念的。

1 个答案:

答案 0 :(得分:3)

如果您想阅读,那么简单而强大的解决方案就是使用fgets()。根本不要使用scanf()(相关:Why does everyone say not to use scanf? What should I use instead?)。

fgets()有一点需要注意 - 如果缓冲区有足够的空间需要注意,它也会在换行符中读取。