【问题标题】:Why my program doesn't allow me to input b?为什么我的程序不允许我输入 b?
【发布时间】:2022-11-18 04:27:34
【问题描述】:

我想为 a 和 b 输入 valors,a 是一个 int,b 是一个 str。当我运行我的程序时,我可以输入一个 valor,但随后它会忽略 b 的 printf() 和 gets()。

#include<stdio.h>>
int main()
{
    int a;
    char b[5];
    printf("Write a:\n");
    scanf("%i", &a);
    printf("Write b:\n");
    gets(b);
    printf("a = %i, b = %s", a, b);
    return 0;
}

最后,它只是打印:

a = (valor written), b =

我不知道这有什么问题,也不知道它是否是一种不同的工作方式。我是 C 的新手。提前谢谢你。 ;)

【问题讨论】:

  • 最好使用fgets(b, sizeof b, stdin);。请记住,对于用户输入,您可能不得不满足于换行符,并且不要忘记在缓冲区中为空终止符留出空间。因为您只有 3 个字符的用户输入空间。
  • gets 已从 C11 中删除,因此这可能会在您的验证器中造成一些混乱。

标签: c printf scanf codeblocks gets


【解决方案1】:

gets 函数不安全,C 标准不支持。而是使用 scanffgets

至于你的问题,那么在 scanf 的这个电话之后

scanf("%i", &a);

输入缓冲区包含对应于按下的 Enter 键的换行符 ' '。并且随后的 gets 调用通过遇到换行符读取一个空字符串。

而不是使用gets

scanf( " %4[^
]", b );

注意格式字符串中的前导空格。它允许跳过空白字符,例如换行符' 'scanf的调用可以读取最大长度为4的字符串。如果要读取更大的字符串,则扩大数组b和格式字符串中的字段宽度说明符。

【讨论】:

  • +1 提供了另一个很好的例子,说明为什么 scanf() 不应该比例如更受欢迎。 fgets() 执行用户输入任务时。正确使用scanf的规则多种多样、复杂且容易出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2019-10-16
  • 2021-04-26
相关资源
最近更新 更多