【问题标题】:for loop skips one round on reading values to char array in c++for循环在将值读取到c ++中的char数组时跳过一轮
【发布时间】:2016-04-21 15:18:15
【问题描述】:

所以我得到了这件奇怪的事情发生在我身上。 我有一个二维 char 数组,我想将值放入数组中,条件如下:

  1. 每个单词(字符串)应该在不同的数组中(不同的 行)
  2. “。”是输入结束的指示符。

这是我的代码:

 const int MAX_STRS = 10, MAX_STR_LEN = 8;

 int main()
 {
    char dict[MAX_STRS][MAX_STR_LEN] = { 0 };

    getArray(dict);
    return EXIT_SUCCESS;
 }

 void getArray(char array[][MAX_STR_LEN])
 {
    bool dot = false;
    int i, j;
    for ( i = 0; i < MAX_STRS && !dot; i++)
      for ( j = 0; j < MAX_STR_LEN && !isspace(array[i][j - 1]); j++)
        {
         array[i][j] = cin.get();
         if (array[i][j] == '.')
          {
            dot = true;
            break;
          }
         }
  }

我要阅读的行是:

blabla 挑了好皮特一个哈哈哈的腌吹笛者。

由于某种原因,每次 i=8 时,j 都会自动具有相同的值 (j=8),并跳过这一轮循环。

我们将不胜感激!

【问题讨论】:

  • j 为零时,您访问array[i][-1] 这可不好。
  • 是什么让你认为j 是 8?
  • @AlanStokes:可能他使用调试器查看它,并且他的编译器将 j 变量保留在 for 循环范围之外的堆栈中,在这种情况下,j 的值将是 8 直到调试器步骤之后在 j 的 for 循环中。
  • 太棒了!没注意到,效果很好,谢谢!
  • @RoiAvram:什么效果很好?如果修复不是以下答案之一,请编写您自己的答案(是的,这是允许的)。在任何一种情况下,将其中一个答案标记为已接受(复选框),以便人们知道您的问题已解决。

标签: c++ arrays for-loop char


【解决方案1】:

问题是当 j=0 时,我让他检查 array[-1] 是否有空格。

反正这里是固定代码:

void getArray(char array[][MAX_STR_LEN])
{
bool dot = false;
int i, j;
for ( i = 0; i < MAX_STRS && !dot; i++)
    for ( j = 0; j < MAX_STR_LEN ; j++)
    {
        array[i][j] = cin.get();
        if (array[i][j] == '.')
        {
            dot = true;
            break;
        }
        if( isspace(array[i][j]))
            break;
    }
 }

感谢 Alan Stokes 让我注意到这一点!

【讨论】:

    【解决方案2】:

    我相信您的问题在于:
    for ( j = 0; j &lt; MAX_STR_LEN &amp;&amp; !isspace(array[i][j - 1]); j++)

    问问自己,当 j 为 0 时,你在读什么?该代码尝试从array[i][-1] 读取。那是什么?可以是任何东西!

    如果您的循环提前退出,则 isspace 检查可能返回 true。

    有时要调试这些事情,您需要放弃所有假设,并使用调试器或打印语句单独检查每个事情。

    例如,您可以将此行放在 for 循环之前:
    cout &lt;&lt; isspace(array[i][-1]);

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2018-07-21
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多