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

时间:2019-04-14 04:54:11

标签: c scanf

我知道[^ \ n]是分隔符,它使scanf扫描所有内容,直到按下“ enter”键为止。但是我不知道“%[^ \ n]%* c” 的其余用途是什么。另外,为什么在scanf函数中必须提到“&s”而不是“ s”。

我尝试运行此命令:

char s[100];
scanf("%[^\n]s",s);      
scanf("%[^\n]s",&s);

两者以上的 scanf语句对我来说完全相同。如果它们之间有什么区别,那是什么?

我为什么要使用 scanf(“%[^ \ n]%* c”,&s); 要以上声明吗?

2 个答案:

答案 0 :(得分: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
}

  • 不检查返回值。

如果不检查返回值,则无法确定读取成功,并且s的状态不确定。

  • 没有超限保护

输入第100个字符会怎样? -“非常糟糕。不好。不好。” Necron 99, Wizards 1977

  • 不消耗'\n'

'\n'保留在stdin中,以阻止下一次阅读。

  • 仅在s上没有分配'\n'

如果输入以'\n'开头,则scanf()返回且s不变。未分配""

  • 不需要"s"中的"%[^\n]s"

"s"不是说明符"%[^\n]"的一部分。放下它。

  • 类型&s的格式错误。

%[...]匹配char *,而不是指向char[100](UB)之类的&s的指针。

答案 1 :(得分:0)

您可以使用scanf(“%s”,s)将字符串作为C中的输入。但是,它只接受字符串,直到找到第一个空格为止。

为了将一行作为输入,可以使用scanf(“%[^ \ n]%* c”,s);其中s定义为char s [MAX_LEN],其中MAX_LEN是s的最大大小。这里,[]是扫描集字符。 ^ \ n代表输入,直到没有换行为止。然后,使用此%* c读取换行符,在这里使用的*表示该换行符已被丢弃。

注意:输入字符和字符串后,按上述语句输入句子将不起作用。这是因为在每一行的末尾都有一个换行符(\ n)。因此,语句:scanf(“%[^ \ n]%* c”,s);将不起作用,因为最后一条语句将从前一行读取换行符。这可以通过多种方式来处理,其中之一是:scanf(“ \ n”);最后一个语句之前。