【问题标题】:Scanf function not waiting for string inputScanf 函数不等待字符串输入
【发布时间】:2017-01-20 12:40:35
【问题描述】:

在这段代码中,在为前两个 scanf 函数提供输入之后。输出会自动显示。我学习了这种形式的 scanf 字符串。但它并没有专门等待它。有什么建议么 ?

#include <stdio.h>

int main()
{
    int p;
    int q;
    char kog[50];

    scanf("%d",&p);
    scanf("%d",&q);
    scanf("%50[^ ]s",kog);

    printf("%d %d %s",p,q,kog);

    return 0;
}

【问题讨论】:

  • 对于交互式输入读取 lines.
  • 您的扫描集将允许制表符和换行符,但不允许空白。它类似于%50s。此外,您必须指定不包括空字节的长度,因此您需要在格式中使用49 而不是50(或将数组维度更改为51)以确保安全。 off-by-one 是历史性的,因此是神圣不可侵犯的,但不幸的是与大多数其他指定缓冲区长度的函数不一致。如果数字在不同的行上,您可能希望在扫描集 (" %49[^ ]") 之前有一个空格,以跳过前一个 %d 留下的换行符。
  • 关于这一行:scanf("%50[^ ]s",kog); 用于 char 字符串输入的函数 scanf() 将始终附加一个 NUL 字节,因此语句应为:scanf("%49[^ ]s",kog);。此外,[...] acts to input a string, so the trailing s` 不应该在那里。使用:scanf("%49[^ ]",kog);

标签: c string scanf


【解决方案1】:

什么意思:

scanf("%50[^ ]s",kog);

如果要扫描直到打印新行,请尝试:

scanf(" %49[^\n]",kog);

顺便说一句,总是提到宽度说明符 1 小于字符串的大小。这是为了避免覆盖终止的空字符。因此,请提及 49 而不是 50 作为宽度说明符。

来自cppreference

如果使用宽度说明符,则仅匹配宽度。除了匹配的字符之外,始终存储一个空字符(因此参数数组必须有空间至少容纳 width+1 个字符)。

另外,请注意扫描集转换在] 完成。结构是"%49[…]",仅此而已。一个常见的误解是扫描集后面应该跟s

并在scanf() 中的% 之前提供一个空格,以避免消耗在前一个条目末尾输入的换行符。

【讨论】:

  • 是的,我已经在 scanf scanf(" %49[^\n]",kog); 中提到了一个空格,以避免消耗新行。我已经添加了有关它的信息:)
  • 发布的代码包含一个“神奇”数字。 IE。 50.“魔术”数字是没有根据的数字。建议给“神奇”数字起有意义的名字,然后在整个代码中使用这些有意义的名字。
  • 更好的代码序列是:#define MAX_STR_LEN 49 .... char kog[ MAX_STR_LEN+1]; ... scanf(" %" MAX_STR_LEN "[^ ]",kog);
  • 其实宽度需要比输入缓冲区的实际长度小一,这样scanf()的调用才不会超出输入缓冲区的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多