2012-02-23 9 views
1

さて、私は私がここに欠けている何かがあると確信しているが、私はそれが何であるか見当がつかないと私は誰かが私はそれを把握助けることができる願っています。読みの入力()とのprintfと印刷()

私は、コマンドラインから入力して読んでいるとfgetc関数を使用する関数を書いていた()そうします。しかし、機能の表面上の見た目の変化は、それが完全に異なった振る舞いをする原因となります。

これは、main()関数です:

while(1) 
{ 
    char* cmd = malloc(sizeof(char) * 80); 
    printf("Enter command: "); 
    read_flush(cmd, 80); 
    printf("%s\n", cmd); 
    free(cmd); 
} 

そして、これがread_flushのバージョン()のいずれかです。

int read_flush(char* buffer, int count) 
{ 
    int i, c; 
    for(i = 0; i < count; i++) 
    { 
     c = fgetc(stdin); 
     if(c == '\n' || c == EOF) 
      return i; 
     buffer[i] = (char)c; 
    } 

    return i; 
} 

この1つは正常に動作します。あなたは入力を入力し、それはそれを吐き出すでしょう。 しかし、この次のバージョンでは、入力を入力する機会をユーザーに与えずに、メインに "Enter command:"を何度も何度も印刷します。

int read_flush(char* buffer, int count) 
{ 
    int i, c; 
    while(i < count)  
    { 
     c = fgetc(stdin); 
     if(c == '\n' || c == EOF) 
      return i; 
     buffer[i] = (char)c; 
     i++; 
    } 

    return i; 
} 

fgetc()で微妙なことは何ですか?

答えて

1

は、2番目のread_flush実装でiを初期化してみます。あなたが最初のバージョンで行うように私はゼロに初期化されていないように見える番目のバージョンで

+0

Wow、whoops。ええ、そうだった。 – user1227489

+0

特にポインタを使って作業するときは、常に変数を初期化するという習慣を覚えておくとよいでしょう。それはあなたに多くの頭痛を軽減します。 –

1

。だから、countより大きいガベージ値で開始する可能性があるため、ループは決して実行されません。

1

どちらのバージョンも同じエラーを持っています。文字列の最後にNULを追加しないでください。 mallocは、返されるメモリを初期化しません。

+0

+1:非常に重要なポイント。 –

関連する問題