scanf()不接受空格

时间:2014-08-12 05:22:52

标签: c++ c scanf

我需要一个scanf()调用来接受空格(没有标签或换行符,只有' '空格字形)。

char buffer[2048];
scanf(" %2048[0-9a-zA-Z ]s", buffer);

我从这个问题的答案中得到了这个格式说明符:

how-do-you-allow-spaces-to-be-entered-using-scanf

虽然它接受第一个输入序列就好了,但它终止于第一个空白字符所在的位置,并带有空字符。发生了什么事?我可能使用了错误的格式吗?

我应该说,我在这里使用scanf()是因为安全不是问题所在;我是唯一一个曾经使用过这个特定程序的人,输入是严格格式化的。

4 个答案:

答案 0 :(得分:4)

使用scanf("%[^\n]",buffer);。它会接受空白区域。

示例程序 -

int main()
{
    char buffer[2048];
    printf("Enter the string\n");
    scanf("%[^\n]",buffer);

    printf("%s\n", buffer);
    return 0;
}

输出 -

root@sathish1:~/My Docs/Programs# ./a.out 
Enter the string
abc def ghi ijk
abc def ghi ijk
root@sathish1:~/My Docs/Programs# 

答案 1 :(得分:1)

Scanf不适合处理您希望拥有特定空白量的格式。从scanf手册页:

  

格式字符串中的空格(如空格,制表符或换行符)在输入中匹配任意数量的空格,包括无空格。

  

[

     

匹配指定集合中的非空字符序列   接受的人物;下一个指针必须是指向char的指针,并且   字符串中的所有字符必须有足够的空间,加上a   终止NUL字符。 通常跳过前导空格会被抑制。

这意味着您可以执行类似

的操作
scanf("%[^\n]",buffer); 

其中说:“除了字符串末尾的换行符之外的所有内容”。

或者,如果你想跳过第一个空格,你可以这样做:

scanf("%*[ ]%[^\n]",buffer); 

这表示“读取但忽略空格字符,然后将其他所有内容读入buffer”。

答案 2 :(得分:1)

虽然您可以使用scanf,但如果您正在阅读文本行,则首选getline并提供动态内存分配的优势(当 line = NULL 时)。 getline会读取/保存newline字符,因此如果不需要,可以轻松删除它。以下示例说明了这一点:

#include <stdio.h>

int main (void) {

    char *line = NULL;
    ssize_t read = 0;
    size_t n = 0;

    printf ("\nEnter a line of text: ");
    read = getline (&line, &n, stdin);
    line [read - 1] = 0;  /* strip newline from string (optional) */
    read--;

    printf ("\n  read '%zd' characters: '%s'\n\n", read, line);

    return 0;

}

<强>输出:

./bin/getln

Enter a line of text: this is a line of text   with  white ..   ..  space.

  read '52' characters: 'this is a line of text   with  white ..   ..  space.'

答案 3 :(得分:0)

fgets(string, sizeof(string), stdin)将接受或scanf("%[\n]s",string);接受