控制流程理解
Control flow understanding
我在理解以下程序流程时遇到了很多麻烦:
#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] = '[=10=]';
// 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 的值并继续下一个单词。
我已经尝试阅读文档,运行宁一半的程序并用回声询问,运行宁一个调试器。应该是,一切 运行 都很完美,代码没有问题(据我所知)。我是问题所在。我只是不明白它是如何工作的。
PS:很抱歉,如果这对你们中的一些人来说可能如此微不足道,我真的开始学习编程,我发现有时真的很难理解看似如此简单的概念。
非常感谢你们抽出时间来。
一旦在if...else
块中执行了某些东西,它就会移出块。因此,如果它满足第一个 if
条件,则甚至不会检查 else if
条件。因此,如果 index > 0 AND c=\ 或 c 是字母表,它会运行 if 语句,即使其中一个条件不成立,它也会移至 else if 块的部分。
注意 else if (index > 0)
条件开头的 else
。
这意味着它只会在前面的if()
和else if()
中的none执行时才会执行。
前面的 if()
和 else if()
语句在字符为字母数字或非前导斜杠时会继续执行,因此最后一个 else if()
仅在非字母数字字符时执行一次,或遇到前导斜杠。
我在理解以下程序流程时遇到了很多麻烦:
#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] = '[=10=]';
// 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 的值并继续下一个单词。
我已经尝试阅读文档,运行宁一半的程序并用回声询问,运行宁一个调试器。应该是,一切 运行 都很完美,代码没有问题(据我所知)。我是问题所在。我只是不明白它是如何工作的。
PS:很抱歉,如果这对你们中的一些人来说可能如此微不足道,我真的开始学习编程,我发现有时真的很难理解看似如此简单的概念。
非常感谢你们抽出时间来。
一旦在if...else
块中执行了某些东西,它就会移出块。因此,如果它满足第一个 if
条件,则甚至不会检查 else if
条件。因此,如果 index > 0 AND c=\ 或 c 是字母表,它会运行 if 语句,即使其中一个条件不成立,它也会移至 else if 块的部分。
注意 else if (index > 0)
条件开头的 else
。
这意味着它只会在前面的if()
和else if()
中的none执行时才会执行。
前面的 if()
和 else if()
语句在字符为字母数字或非前导斜杠时会继续执行,因此最后一个 else if()
仅在非字母数字字符时执行一次,或遇到前导斜杠。