此
char str[20];
scanf("%19[^\n]s",str);
getchar(); // To remove the `\n`
printf(str);
和
char str[20];
scanf("%19[^\n]",str);
getchar(); // To remove the `\n`
printf(str);
产生相同的结果。我知道[^\n]
会在遇到\n
之前进行扫描。但我无法理解的是
scanf
之间是否存在差异?s
中不是scanf
吗?答案 0 :(得分:5)
由于您已撰写"%19[^\n]"
,因此您不需要%s
来表明它是一个字符串。
它已由您想要阅读的字符数(19)指定。
声明:
scanf("%19[^\n]s",str);
需要一个字符串,然后需要s
个字符。
回答你的问题:我应该使用哪一个?
都不是。使用fgets
进行此特定输入。
答案 1 :(得分:3)
让我们说输入是
Line one
stuvwxyz
第一个scanf()
将"Line one"
读入str
,然后无法读取s;
第二个scanf()
将"Line one"
读入str
并且不会失败。
在这两种情况下,输入位置都在"第一行"结束时的换行符。
如果scanf()
在转换字符串中有空格来使用换行符(不一定是个好主意)
scanf("%19[^\n] s", str);
scanf("%19[^\n] ", str);
然后是另一个scanf()
,第一个scanf的代码将在"tuvwxyz"
中读取;第二个代码将显示为"stuvwxyz"
。
答案 2 :(得分:3)
该程序只读取一个输入。由于%19[^\n]s
无法阅读'
#include<stdio.h>
#include<stdlib.h>
int main() {
char acText[20] = {""};
char acTexts[20] = {""};
scanf ( "%19[^\n]s %19[^\n]", acText, acTexts);
printf ( "%s\n", acText);
printf ( "%s\n", acTexts);
return 0;
}
该程序将读取两个输入
#include<stdio.h>
#include<stdlib.h>
int main() {
char acText[20] = {""};
char acTexts[20] = {""};
scanf ( "%19[^\n] %19[^\n]", acText, acTexts);
printf ( "%s\n", acText);
printf ( "%s\n", acTexts);
return 0;
}