2016-10-10 43 views
0

私のCプログラムで、buffer[ ]配列に格納されている文字列が出力されないという問題があります。printfがC言語で文字配列を出力しない

私のコードは次のとおりです。

#include <stdio.h> 
#include <ctype.h> 

int main() 
{ 
    int textSize = 20; 

    int index, ch; 
    int count = 0; 
    int upperCount = 0; 
    int lowerCount = 0; 
    char buffer[textSize]; 

    FILE *pToFile = fopen("input.txt", "r"); 

    if (pToFile != NULL) 
    { 
    while (!feof(pToFile)) 
    {  
     /* Read in a single line from "stdin": */ 
     for(index = 0; (index < textSize) && ((ch = fgetc(pToFile)) != EOF) 
         && (ch != '\n'); index++) { 
     if(islower(ch)) 
     { 
      buffer[index] = toupper(ch); 
      count++; 
      upperCount++; 
     } 
     else if(isupper(ch)) 
     { 
      buffer[index] = tolower(ch); 
      count++; 
      lowerCount++; 
     } 
     else 
     { 
      buffer[index] = (char)ch; 
      count++; 
     } 
     } 
    } 
    } 
    fclose(pToFile);  

    /* Terminate string with null characters: */ 
    buffer[index] = '\0'; 

    /* Print output out onto screen */ 
    printf("%s\n", buffer); 
    printf("Read %d characters in total, %d converted to upper-case, %d to lower-case\n", 
          count, upperCount, lowerCount); 
    return 0; 
} 

最初printf文が印刷されません、しかし、もう一つはありません。 これがなぜこのような理由で説明できるのですか?

+4

[なぜ 'while(!feof(pToFile))'が間違っているのですか?(http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) – Barmar

+0

2番目の 'printf 'と呼ばれる?それは何をすべきか?入力(ファイル)とは何ですか?そして、「なぜwhile(!feof(file))」がいつも間違っているのはなぜですか?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –

+0

ああ、実際にデバッガを使用する方法を学ぶ必要がありますので、コードを一行ずつ進んで問題を簡単に見つけ出すことができます。 –

答えて

1

問題はあなたのループであり、特にそのループはwhile (!feof(pToFile))です。

あなたのテキストには、改行で終わる1行の長さが19文字未満であるとします。最後のビットは、改行で終わる行が重要です。

ファイルを読み込んだときに改行が発生した場合は、内側のforループを破って外側のループに戻ります。ファイルの最後をまだパスしていないので、feof(pToFile)はfalseを返し、ループはforに戻ります。

forループのこの時間、あなたがfgetcを呼び出す非常に最初の時間、それはあなたがファイルの末尾にあることに気づくとEOFを返し、あなたはループの外に解除されます。ただし、forループの初期化式がindex = 0であるため、indexがゼロに等しいループを終了します。

今、ファイルはその端にあり、かつfeof(pToFile)はtrueを返します、そしてあなたが外側のループを終了し、その後、あなたはindexがゼロであることと、バッファ内の文字列を終了し、あなたが今、あなた

buffer[0] = '\0'; 

を行う、すなわち、あなたが印刷する "空の"文字列があります。

シンプルなソリューションですか?外側のwhileループをスキップすると、必要ありません。

+0

ありがとうございました! – Zaya

関連する問題