scanf()不接受空格。

3
我需要一个scanf()函数调用来接受空格(没有制表符或换行符,只有' '空格符号)。
char buffer[2048];
scanf(" %2048[0-9a-zA-Z ]s", buffer);

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

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

虽然它可以很好地接受第一个输入序列,但是它会在第一个空格字符处终止,并带有一个空字符。发生了什么?也许我使用的格式不正确?

我应该说,我在这里使用scanf(),因为安全性并不是一个问题;只有我会使用这个特定的程序,并且输入已经严格格式化。


应该是这样的 scanf("%^[\n ]s",buffer); - Satya
需要在缓冲区之前添加 & - Suji
@SujithKarivelil - 缓冲区已经是一个指针(来自数组脚本),所以没问题。 - Anne Quinn
1
缓冲区不是一个指针 - 它是一个数组引用,这与指针并不相同。然而,当以这种方式使用时,数组引用会衰减为指针,因此不包括&是正确的做法。 - Timothy Jones
4个回答

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

2

Scanf不适用于处理期望具有特定空格数量格式的内容。从scanf手册中可以看到:

格式字符串中的空格(如空格、制表符或换行符)与输入中的任何数量的空格(包括零个)匹配。

并且:

[

匹配指定集合中非空字符序列;下一个指针必须是char类型,并且必须有足够的空间容纳字符串中的所有字符,以及一个终止的NUL字符。通常跳过前导空格的操作被取消。

这意味着您可以做如下操作:

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

这段内容的意思是:“读取字符串末尾之前的所有内容,但不包括末尾的换行符。”

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

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

这句话的意思是“读取但忽略一个空格字符,然后将其余所有内容读入buffer中”。

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;

}

output:

./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.'

0

fgets(string, sizeof(string), stdin) 将接受输入,或者 scanf("%[\n]s",string); 也可以接受输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接