什么是scanf(“%[^ \ n]%* c”,&s);实际上呢?

问题描述 投票:2回答:2

我知道[^ \ n]是一个分隔符,它使scanf扫描所有内容,直到“输入”键被命中。但我不知道“%[^ \ n]%* c”的剩余部分是用于什么的。另外,为什么我们必须在scanf函数中提及“&s”而不是“s”。

我试过这个:

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

上面的scanf语句对我来说都是完全相同的。如果他们之间有任何差异,那是什么?

另外为什么我更喜欢scanf(“%[^ \ n]%* c”,&s);上述声明?

c scanf
2个回答
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


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”);在最后一次陈述之前。

© www.soinside.com 2019 - 2024. All rights reserved.