【问题标题】:How can I clear the buffer in a C for loop? [closed]如何清除 C for 循环中的缓冲区? [关闭]
【发布时间】:2020-06-05 22:07:33
【问题描述】:

我正在从事一个涉及结构的学校项目,但遇到以下问题:

我创建了一个最多包含 50 个产品的结构。 用户将为每个产品输入 INT 代码、FLOAT 价格、INT 数量和 CHAR 名称[256]。

我遇到的问题是scanf_s("%c", &product.name); 溢出了“\n”。

这里是sn-p的代码: Lines 84 -> 88

我希望你能理解我的问题并帮助我。

【问题讨论】:

  • 编辑您的帖子以将相关代码直接放入内容中。如果是minimal reproducible example,那就更好了。
  • 你的意思是getchar()
  • 也许您想要类似scanf("%s", product.name) 的东西,而不是读取单个字符的字符串
  • 查看链接的“code sn-p” .... 因一个错误而关闭。数组索引从零开始,因此具有n 元素的数组的最后一个元素具有索引n-1。您的循环具有从 1 开始的数组索引。投票结束,因为这本质上是一个(愚蠢的)错字。

标签: c struct scanf


【解决方案1】:

您应该使用%s 来扫描字符串。 \0 将自动添加到字符串的末尾。

请记住,您只有 256 个字节的数据,如果您想添加更大的字符串,它将溢出。

scanf('%s', obj.propertry);

由于您添加了 C++ 标签。查看std::string 对象和std::cin

std::getline(std::cin, str);

【讨论】:

  • 两个错误:scanf 格式为%s不会在字符串中添加换行符;而且你永远不应该在字符串上使用地址运算符&。对于数组,它将导致参数的类型错误,对于指针,它将指向指针,scanf 将写入完全错误的位置。
  • 感谢指正。我的意思是\0
【解决方案2】:

scanf 有它的位置,但它不是读取用户输入的唯一方法,尤其是从stdin 读取一行时。考虑使用fgets 阅读这些行...

fgets(produse[contor].nume_produs, sizeof(produse[contor].nume_produs), stdin);

也可以。

这里是关于differences and use casesfgets()scanf() 的一些信息

【讨论】:

    【解决方案3】:

    你应该阅读:

    scanf("%s", name);

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多