繁体   English   中英

scanf()不接受空格

[英]scanf() doesn't accept whitespace

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

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

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

怎么办-你-让-空间到使用被输入的-,scanf函数

尽管它可以很好地接受第一个输入序列,但它会在第一个空白字符所在的位置终止,并带有一个空字符。 这是怎么回事? 我是否使用了错误的格式?

我应该说,我在这里使用scanf()是因为安全不是问题; 我是唯一会使用此特定程序的人,并且输入格式严格。

使用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# 

Scanf不适用于处理您期望具有特定空白量的格式。 scanf手册页:

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

和:

[

匹配指定接受字符集中的非空字符序列; 下一个指针必须是指向char的指针,并且必须有足够的空间容纳字符串中的所有字符以及一个终止NUL字符。 通常的前导空白跳过被抑制。

这意味着您可以做类似的事情

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

它说:“读取除字符串末尾的换行符以外的所有内容”。

或者,如果您想跳过第一个空格,则可以执行以下操作:

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

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

虽然可以使用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.'

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM