【问题标题】:Stopping user input using the enter key in C使用 C 中的 enter 键停止用户输入
【发布时间】:2020-04-26 00:32:09
【问题描述】:

我正在尝试编写一个使用 fgets 接收字符串的程序,但由于某种原因,我无法让它通过用户输入阶段。一旦用户输入“空白行”,输入应该停止,即。 Enter 键 (\n),但即使按下此键,循环也会继续。

这是我的代码有问题的部分:

char array[100][256];
for (int i = 0; array[i] != '\n'; i++)
{
    fgets(array[i], 256, stdin);
}

100 和 256 分别代表预期的最大行数和字符数。

有人知道我哪里出错了吗?

【问题讨论】:

  • array 未初始化,但您立即检查它不是\n,因此未定义行为。
  • 提示:编译时启用警告...
  • @FlorentSebag 那不得不读array[i-1][0] != '\n',这在第一次迭代中显然是有问题的
  • 您需要在循环之前执行第一个 fgets,然后更改您的条件以放置:for (int i = 0; array[i][0] != '\n'; i++)
  • @underscore_d 在这种情况下,它可以,因为对未初始化数组的读取访问发生在进入循环之前的 for 条件子句中,而条件被检查 after i> “do...while”循环中的第一次迭代。当然,你必须正确使用它。

标签: c arrays string loops fgets


【解决方案1】:

这是您的代码,修改最少,在 cmets 中进行了解释。请注意,这不是解决问题的好方法,例如,长行可能无法按照您的意愿行事(它们会在几行 array 处拆分)。

char array[100][256];
memset(array, 0, sizeof array); // initialize the memory
int i = 0;
while(i<100) // avoid overflow of lines, also while may be clearer than for loop
{
    if(!fgets(array[i], 256, stdin)) break; // detect read failure
    if(array[i][0] == '\n') break; // got empty line
    // Note [0] above to test first char of line i
    ++i;
}
if (i==100) { /* too many lines */ }
else if (array[i][0] == 0) { /* read failure */  }
else {  /* indexes 0...i-1 contain data, index i contains empty line */ }

【讨论】:

  • if (i==100) -- i 将超出范围,i 的范围仅限于上述循环。 (将i 的声明移出循环声明,也许吧?)
  • @DavidC.Rankin 啊,是的。我把整个循环变成了while,当我这样做的时候,我认为这样更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
相关资源
最近更新 更多