我知道[^ \ n]是一个分隔符,它使scanf可以扫描所有内容,直到按下“ enter”键为止。但是我不知道其余的“%[^ \ n]%* c”是做什么用的。另外,为什么我们必须在scanf函数中提及“&s”而不是“ s”。
我尝试运行此:
char s[100];
scanf("%[^\n]s",s);
scanf("%[^\n]s",&s);
Run Code Online (Sandbox Code Playgroud)
上面的两个scanf语句对我来说完全一样。如果它们之间有什么区别,那是什么?
另外,为什么我更喜欢 scanf(“%[^ \ n]%* c”,&s); 以上声明?
scanf("%[^\n]s",&s);有很多麻烦:
不检查返回值。
无溢出保护
的无消耗'\n'
的无分配s上'\n'唯一
无需s在"%[^\n]s"
错误的类型&s与格式。
scanf("%[^\n]s",s); 只有一个少的问题(最后一个)。
使用 fgets(s, sizeof s, stdin)
if (fgets(s, sizeof s, stdin)) {
s[strcspn(s, "\n")] = 0; // Lop off potential ending \n
// Success
} else {
// failure
}
Run Code Online (Sandbox Code Playgroud)
如果不检查返回值,则读取成功的状态是s不确定的并且是不确定的。
输入第100个字符会怎样?-“非常糟糕。不好。不好。” Necron 99,巫师1977
'\n' '\n' 仍在stdin犯规以备下次阅读。
s在不分配'\n'如果输入以开头'\n',则scanf()返回且s不变。未分配""。
"s"在"%[^\n]s" 该"s"不是说明符的一部分"%[^\n]"。算了吧。
&s,格式错误。 %[...]匹配一个char *,而不是指向char[100]like &s (UB)的指针。
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |