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

achar *はではないからcharです。

このfgetc関数は、文字列ではなく文字を返します。つまり、ifステートメントのグループ全体も間違っているということです。次のような単純なことを行う必要があります。

if( c == ' ' ) {
} else if( c == ':' ) {
} ...
于 2010-09-20T15:37:00.590 に答える
0

はい、fgetc() は char や char* ではなく、int を返します。何でこれが大切ですか?EOF は通常 (常に?) -1 として定義されているためです。fgetc() が EOF を 8 ビット char に返す場合、0xFF として表されます。一部の文字セットでは、これは有効な文字です。たとえば、ISO-8859-1 の y ウムラウト。したがって、

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

ファイルの終わりと、ストリームに正当に表示される文字の 1 つを区別することはできません。

于 2010-09-20T17:00:56.113 に答える
-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 に答える