如何打印由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);
}