如何打印由scanf扫描的字符串(“%*[^\n]”,str);

如何打印由scanf扫描的字符串(“%*[^\n]”,str);,c,C,我用这些行扫描一个带空格的字符串 scanf ("%*[^\n]", first_line); printf("%s\n",first_line); 但是它不起作用!!!怎么办?在scanf中的*(“%*[^\n]”,第一行)告诉scanf扫描,但不存储扫描的字符串 在您的例子中,只有一个参数,因此没有设置 请注意,-Wall(或-Wformat extra args)在“最近的”gcc编译器上发出警告: test.c: In function 'main': test.c:6:8: war

我用这些行扫描一个带空格的字符串

scanf ("%*[^\n]", first_line);
 printf("%s\n",first_line);

但是它不起作用!!!怎么办?

scanf中的
*
(“%*[^\n]”,第一行)
告诉
scanf
扫描,但不存储扫描的字符串

在您的例子中,只有一个参数,因此没有设置

请注意,
-Wall
(或
-Wformat extra args
)在“最近的”
gcc
编译器上发出警告:

test.c: In function 'main':
test.c:6:8: warning: too many arguments for format [-Wformat-extra-args]
 scanf ("%*[^\n]", first_line);
        ^~~~~~~~~
这很好:

 scanf ("%[^\n]", first_line);
 printf("%s\n",first_line);
您甚至可以限制读取的大小(使
scanf
更安全),如下所示:

char first_line[10] = {0};
scanf ("%9[^\n]", first_line);
所以,即使用户输入超过9个字符,也不会使缓冲区溢出

但是请注意,如果
\n
之前的行中没有字符,
scanf()
将无法匹配
%[^\n]
转换规范,并返回
0
,而不消耗标准输入的任何字节。因此,更可取的做法是使用
fgets()

char line[100];

if (fgets(line, sizeof line, stdin)) {
    /* a line was read from standard input */
    /* you can strip the newline character with this simple one liner */
    line[strcspn(line, "\n")] = '\0';
    printf("%s\n", line);
}
此代码将丢弃所有字符,直到遇到
\n
。因此,您没有在
第一行
变量中存储任何值

不要使用
scanf
读取字符数组或字符串。相反,您可以使用
fgets


其中80是
第一行字符数组的大小。

%*
:我认为这忽略了该字段,因此
第一行
不是由
扫描设置的,为什么不使用
fgets
?它比
scanf
更安全。您能更准确地说明您得到的错误吗?
scanf(“%*[^\n]”,第一行)应该引发编译器警告。节省时间并启用所有警告。提示:避免否决投票。而不是“但它不起作用!!!”张贴使用的输入、看到的输出和预期的输出。亲爱的downvoter如果您能提供一个downvoter的原因,我将不胜感激。这样我可以改进我的帖子,学到新东西。谢谢不是downvoter,但您没有解释操作代码不起作用的原因,只是提出了另一种方法,劝阻他/她使用
scanf
,这在正确使用时仍然有用。它给人的印象是一个离题的答案。然后,(这可能是次要的)
fgets
并不是严格等价的,因为它消耗了@Jean Françoisfare输入的\n个字节。至少你改进了你的帖子+1@chqrlie干得好关于scanf的这些微妙之处,我还有很多要学。C语言不是处理文本文件的最简单语言。
 scanf ("%*[^\n]", first_line);
char first_line[80];
while(fgets(first_line, 80, stdin)) {
    printf("%s",first_line);
}