scanf(“%[^ \ n]%* c”,&s)是什么?真的吗?

Ala*_*kar 2 c scanf

我知道[^ \ 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); 以上声明?

chu*_*ica 5

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)的指针。