2

为什么这不编译?看不到错误

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *c;
    FILE *f = fopen("file.txt", "r");

    if(f == NULL) {
        printf("Could not open file");
    }

    while((c = fgetc(f)) != EOF) {
        if(strcmp(c, " ") == 0) {
            printf(" ");
        } else if(strcmp(c, ":") == 0) {
            printf(":");
        } else if(strcmp(c, "@") == 0) {
            printf("@");
        } else if(strcmp(c, "\n") == 0) {
            printf("\n");
        } else {
            printf("Not a valid char");
    }
}

}

4

4 回答 4

11

fgetc以整数形式返回当前位于文件指针处的 char。

所以char *c;应该是int c;

if(strcmp(c, " ") == 0) {

应该

if(c == ' ') {

并类似地改变其他比较。

您可以将比较压缩为:

while((c = fgetc(f)) != EOF) {
    if(c == ' ' || c == ':' || c == '@' || c == '\n') {
        printf("%c",c);
    } else {
        printf("Not a valid char");
    }
}
于 2010-09-20T15:35:17.840 回答
0

是的,fgetc() 返回 int,而不是 char 或 char*。为什么这很重要?因为EOF通常(总是?)定义为-1。如果 fgetc() 将 EOF 返回为 8 位字符,它将表示为 0xFF。在某些字符集中,这是一个有效字符。例如 ISO-8859-1 中的 y-umlaut。因此使用

char c; // << this is wrong, use int
while((c = fgetc(aFile)) == EOF)
{
     // stuff
}

您无法区分文件结尾和可以合法出现在流中的字符之一。

于 2010-09-20T17:00:56.113 回答
0

因为 achar *不是 a char

fgetc函数返回一个字符,而不是字符串。这意味着您的整个if陈述组也是错误的。你应该做一些简单的事情,比如:

if( c == ' ' ) {
} else if( c == ':' ) {
} ...
于 2010-09-20T15:37:00.590 回答
-1

如前所述, fgetc 返回一个 int 实际上不是字符串(因此 strcmp 将失败)。我个人更喜欢虽然没有任何不同的字符比较方法是使用开关,因为你有几个打印出输入字符,你可能会有类似的东西:

while( (c = fgetc(f)) != EOF ) {
  switch( c )
  {
    case ' ':
    case ':':
    case '@':
    case '\n':
      printf( "%c", c );
      break;
    default:
      printf( "Not a valid char" );
  }
}

我发现这是最简单的方法,尤其是当您知道以后要扩展您的条件时。(假设你想添加:'f'、'o' 和 'r')

于 2010-09-20T15:52:48.587 回答