【发布时间】:2019-04-14 04:54:10
【问题描述】:
我知道 [^\n] 是一个分隔符,它使 scanf 扫描所有内容,直到按下“输入”键。但我不知道 "%[^\n]%*c" 的其余部分是做什么用的。还有为什么我们在scanf函数中必须提到“&s”而不是“s”。
我试过运行这个:
char s[100];
scanf("%[^\n]s",s);
scanf("%[^\n]s",&s);
两个上述 scanf 语句对我来说完全一样。如果它们之间有什么区别,那是什么?
还有我为什么更喜欢 scanf("%[^\n]%*c", &s); 对上述声明?
【问题讨论】:
-
对于已衰减为指针的数组,如您的 scanf 调用中,
s、&s和&s[0]都引用相同的地址。你从哪里听说你应该更喜欢scanf("%[^\n]%*c", &s);? -
非常相似,可能与What does `scanf("%*[^\n]%*c")` mean?重复
-
scanf("%[^\n]%*c", &s);类似于gets()。两者都不使用。而是使用fgets(s, sizeof s, stdin)。 -
你应该更喜欢
fgets(),但如果你必须%[^\n]是一个[...](字符类)格式说明符匹配所有'^'的字符('not'当包括第一个)新队。 (允许读取空格)。'*'字符是 赋值抑制 修饰符,允许读取/丢弃该 转换说明符 的类型(此处为单个字符,例如'\n')。当使用'*'时,不会将任何转换添加到匹配计数(例如返回)。 -
因为调用后输入缓冲区中剩余的内容不取决于使用的转换说明符(或任何读取/丢弃其他字符)。只需使用
fgets并通过覆盖 nul-terminating 字符来修剪换行符——这样可以省去很多麻烦。