控制流程理解

时间:2017-03-22 19:28:45

标签: c control-flow

我在理解以下程序流程时遇到了很多麻烦:

#include <stdio.h>
#include <ctype.h>

int main ()
{
 FILE *fp;
 int index = 0;
 char word[45];
 int words = 0;

 fp = fopen("names.txt","r");
 if(fp == NULL) 
 {
   perror("Error in opening file");
   return(-1);
 }


 for (int c = fgetc(fp); c != EOF; c = fgetc(fp))
 {
     // allow only alphabetical characters and apostrophes
     if (isalpha(c) || (c == '\'' && index > 0))
     {
         // append character to word
         word[index] = c;
         index++;

         // ignore alphabetical strings too long to be words
         if (index > 45)
         {
             // consume remainder of alphabetical string
             while ((c = fgetc(fp)) != EOF && isalpha(c));

             // prepare for new word
             index = 0;
         }
     }

     // ignore words with numbers (like MS Word can)
     else if (isdigit(c))
     {
         // consume remainder of alphanumeric string
         while ((c = fgetc(fp)) != EOF && isalnum(c));

         // prepare for new word
         index = 0;
     }

     // we must have found a whole word
      else if (index > 0)
     {
         // terminate current word
         word[index] = '\0';

         // update counter
         words++;

         //prepare for next word
         printf("%s\n", word);
         index = 0;
     }
     //printf("%s\n", word);
 }

 printf("%s\n", word);

 fclose(fp);
 return(0);
} 

正如您所看到的,它只是一个简单的程序,它将字符中的字符从一个名为“names.txt”的文件背靠背地存储到数组中。

我的问题在于else if(index > 0)条件。 我运行了一个调试器,显然程序正常运行。

这是我的问题:

在第一次for循环迭代中,index变为1.否则,我们将无法在数组中存储整个单词。

如果是这样,当程序流达到else if (index > 0)条件时,它怎么可能没有将word[1]设置为0? (或index)的后续值。

它只是完成整个单词,一旦到达单词的结尾,然后它继续给word[index]值0并继续下一个单词。

我已经尝试阅读文档,运行一半程序并询问echo,并运行调试器。应该是,一切都运行完美,代码没有问题(据我所知)。我是问题所在。我只是无法得到它是如何工作的。

PS:对不起,如果对你们这些人来说这可能是如此微不足道,我真的开始学习编程,我发现有时很难理解这么简单的概念。

非常感谢你们。

2 个答案:

答案 0 :(得分:1)

只要在if...else块中执行某些操作,它就会移出块。因此,如果它满足第一个if条件,则甚至不检查else if条件。所以如果索引&gt; 0和c = \或c是一个字母表,它运行if语句,如果这些条件中的一个条件不成立,则它将移动到else的部分块。

答案 1 :(得分:1)

请注意<footer> <div class="container"> <h1>Finanzdienstleistung</h1> <a href="#">Versicherungen</a><br> <a href="#">Schadensabwickelung</a> </div> <div class="container"> <h1>Vermietung</h1> <a href="#">Freie Wohnungen</a><br> <a href="#">Alle Wohnungen</a> </div> </footer>条件开头的else

这意味着只有在以前else if (index > 0)if()都没有执行时才会执行。

如果字符是字母数字或非前导斜杠,则前一个else if()if()语句会继续执行,因此最后else if()只执行一次非字母数字,或者遇到前导斜杠。