存储一个数字,以便它不会重新定义循环的下一次迭代

时间:2017-01-17 16:23:02

标签: c loops for-loop

我正在尝试编写一个循环,它将计算输入的单词总数以及给定行上的单词数。总词数是累积的,但是,给定行上的词语不是累积的。如何将这个数字存储在循环之外,以便在下一次迭代中不重新定义?

我的想法是将它们存储到int数组中,之后只显示数组,但事实证明这比预期的要困难。

这是一个例子:

Hello World  
cats and dogs 

输出:

5 words total  
2 3 //2 on line one  and 3 on line two 

这就是我到目前为止:

char lines[50];
int numOfLines = 0;
int numOfWords = 0
int i;
int wordsPerLine[50];  //Unused at this point

for(i = 1; i <= 1000; i++){
    fgets(lines,50,stdin);
    if (strcmp(lines, ".\n") == 0){
        break;
    }
    numOfLines++;
    for (i = 0; i < strlen(lines); i++){
            if(lines[i] == ' '){
                numOfWords++;
                wordsPerLine[i] = numOfWords; //everything works up until here
            }
    }
}
for (i = 0; i < numOfLines; i++){
   printf("%d ", wordsPerLine[i]); //trying to print out the array where I'd hope to store them, however I get a bunch of random numbers
}

3 个答案:

答案 0 :(得分:2)

以下是您的问题:

  • 您在内部循环中重用i作为控制变量,因此它会干扰外部循环。为此使用单独的变量(j)。
  • 在外部循环中,您从1开始计数,因此永远不会设置wordsPerLine[0]。从0开始此循环。
  • 您将wordsPerLine[i]设置为当前值numOfWords,这是总字数。相反,在循环之前将此值设置为0并在每次迭代时增加。
  • 在计算单词时需要检查换行符,否则你不会计算最后一行。

完成这些更改后,您的代码应如下所示:

for(i = 0; i <= 1000; i++){
        fgets(lines,50,stdin);
        if (strcmp(lines, ".\n") == 0){
                break;
        }
        numOfLines++;
        wordsPerLine[i] = 0;
        for (j = 0; j < strlen(lines); j++){
                if(lines[j] == ' ' || lines[j] == '\n'){
                    numOfWords++;
                    wordsPerLine[i]++;
                }
        }
 }

编辑:

更改了wordsPerLinenumOfWords的管理方式,以便numOfWords包含外部循环完成时的总字数。

答案 1 :(得分:0)

我发现这个问题是你尝试使用相同的变量i两次作为两个独立循环的计数器,导致错误的逻辑。

为外部循环使用单独的计数器,例如j并使用 变量将内部循环外部的wordsPerLine索引,在外部循环的主体末尾。

答案 2 :(得分:0)

在嵌套for循环中使用不同的计数器并重置numofWords

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tbody id="mergeRowsBody">
    <tr class="rowEditData odd mergeSelect" data-value="110461" role="row">
      <td class="mdl-data-table__cell--non-numeric sorting_1">ABBEVILLE</td>
      <td class="mdl-data-table__cell--non-numeric">South Carolina</td>
      <td class="mdl-data-table__cell--non-numeric">null</td>
      <td class="mdl-data-table__cell--non-numeric">null</td>
      <td class="mdl-data-table__cell--non-numeric">001</td>
      <td class="mdl-data-table__cell--non-numeric">39</td>
    </tr>
    <tr class="rowEditData even mergeSelect" data-value="107045" role="row">
      <td class="mdl-data-table__cell--non-numeric sorting_1">Abbeville County</td>
      <td class="mdl-data-table__cell--non-numeric">South Carolina</td>
      <td class="mdl-data-table__cell--non-numeric">001</td>
      <td class="mdl-data-table__cell--non-numeric">45</td>
      <td class="mdl-data-table__cell--non-numeric">null</td>
      <td class="mdl-data-table__cell--non-numeric">null</td>
    </tr>
  </tbody>
</table>