Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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_String_Scanf - Fatal编程技术网

使用scanf读取带空格的字符串?

使用scanf读取带空格的字符串?,c,string,scanf,C,String,Scanf,我希望下面的内容请求输入,然后输入一个字符串(带空格),然后再执行一次。但在输入第一个字符串后,它会重复输出“input$” char command[80]; while(1) { printf("input$ "); scanf("%[^\n]", command); } 我的输出:nput$input$input$input$input$input$input$input$input$input$input$input$input

我希望下面的内容请求输入,然后输入一个字符串(带空格),然后再执行一次。但在输入第一个字符串后,它会重复输出“input$”

char command[80];

while(1)
    {
        printf("input$ ");
        scanf("%[^\n]", command);    
    }
我的输出:
nput$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input输入$input$input$input$input$input$input$input$^C

我想要的是:

input$ hi
input$ this can take spaces
input$
试试这个:

char command[80];

while(1)
{
    printf("input$ ");
    fgets(command, 80, stdin);    
}

您通常希望使用以下内容:

char command[80];

while(1)
{
    printf("input$ ");
    scanf("%79[^\n]%*c", command);
}
“79”防止缓冲区溢出,
%*c
使用输入缓冲区中的新行。它有一个小缺点:即使输入缓冲区中的下一个字符不是新行,它仍然会消耗(并丢弃)一个字符。如果必须处理这种可能性,可以读取它并忽略它,除非
命令
缓冲区已满:

char ignore;

scanf("%79[^\n]%c", command, &ignore);

if (strlen(command) == 79)
    // `ignore` probably shouldn't be ignored after all

你最好避免使用
scanf
。问题是,一旦您读取到第一个换行符,下一个字符就是换行符,因此
scanf()
报告它无法转换任何内容(返回值0,而不是EOF),但您却轻松地忽略了它。您必须阅读换行符(
getchar()
),才能让它继续。或者在
]
之后添加一个
\n
;或者,实际上,一个空间就可以了。如果不关心前导空格,则
%
前面的空格也可以。正确使用
scanf()
函数非常困难;让初学者使用它们真的是“残酷而不寻常的惩罚”。我支持杰瑞。我认为这是个坏建议。@Lucas:看。请注意,更新后的答案(使用
fgets
)没有问题。+1完美@OP查看scanf(man scanf)的文档,它值得一读——它是一个比你想象的功能强大得多的函数。当代码1)读取以
'\n“
2”开头的行时,会出现问题。如前所述,即使它不是
'\n'
也会消耗第80个字符,而
%79[^\n]]*1[/n]“