0

我的代码在这里

int main(){
  FILE *fp;
  fp = fopen("dic.txt", "r");
  while(getc(fp) != EOF){
    if(getc(fp) == ' '){
        printf("up ");
    }
  }
}

我的 dic.txt 在这里

字典.txt

我的预测是“up up up up”
,因为有四个空格“”

但它只打印了一个

什么是问题?

4

3 回答 3

3

getc每次循环迭代调用两次;这两个调用之一将字符与 进行比较EOF,而另一个调用将字符与 进行比较' '

这有两个后果:

  • 您的程序将仅打印"up"偶数位置的空格,而忽略所有奇数位置的空格;
  • getc在第一次到达后,您的程序可能会额外调用EOF一次。

怎么修

您需要对循环的每次迭代进行一次调用。getc将返回的字符保存getc到局部变量中;然后使用这个变量来检查循环体中的空格,检查EOF循环的条件。

于 2020-11-26T16:14:18.267 回答
0

你要这个:

#include <stdio.h>

int main() {
  FILE* fp;
  fp = fopen("dic.txt", "r");
  if (fp == NULL)
  {
    printf("Can't open file\n");
    return 1;
  }

  int ch;                            // int is needed her, not char !!
  while ((ch = getc(fp)) != EOF) {   // read one char and check if it's EOF in one go
    if (ch == ' ') {
      printf("up ");
    }
  }
}
  • 您只需要在循环中调用getc一次,否则您会跳过两个字符中的一个。
  • 奖励:您需要检查是否fopen失败。
于 2020-11-26T16:20:00.537 回答
0

试用此代码:

FILE *fp;

fp = fopen("dic.txt", "r");
int ch = getc(fp);

while(ch != EOF){
    if(getc(fp) == ' '){
        printf("up ");
    }
}

return 0;
于 2020-11-26T16:40:52.723 回答