C++ scanf()不';我不接受空白

C++ scanf()不';我不接受空白,c++,c,scanf,C++,C,Scanf,我需要一个scanf()调用来接受空格(没有制表符或换行符,只有'空格符号) 我从这个问题的答案中得到了这个格式说明符: 虽然它可以很好地接受第一个输入序列,但它在第一个空白字符所在的位置终止,并使用空字符。发生什么事?我是否使用了错误的格式 我应该说,我在这里使用scanf()是因为安全不是一个问题;我是唯一一个使用这个特殊程序的人,输入的格式是严格的 使用scanf(“%[^\n]”,缓冲区)。它将接受空白 示例程序- int main() { char buffer[2048];

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

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

虽然它可以很好地接受第一个输入序列,但它在第一个空白字符所在的位置终止,并使用空字符。发生什么事?我是否使用了错误的格式

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

使用
scanf(“%[^\n]”,缓冲区)。它将接受空白

示例程序-

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); 

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

当您可以使用
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;

}

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

如果这类似于scanf(“%^[\n]s”,buffer);需要在之前添加
&
buffer@SujithKarivelil-缓冲区已经是指针(来自数组脚本),所以它是确定的缓冲区不是指针-它是数组引用,这是。但是,当以这种方式使用数组引用时,它是正确的,因此不包括
&
#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.'