1

私のプログラムは入力からスキャンし、使用されているすべての大文字を出力します。

私のプログラムの最後にも標準入力からの元の入力を印刷しようとしています。

しかし、printf を使用すると、入力式の最初の部分がスキップされ、文字配列の残りの部分が出力されるようです。問題がどこにあるのかを教えてください。-コード内のコメント-

#include <stdio.h>

int main(void){

char input[81];
int letters[91];
int i;

    //initialize arrays input and letters
for (i = 0; i < 90; i++) letters[i] = 2;
for (i = 0 ; i < 80; i++) input[i] = 'a';
i = 0;  

    //reads into input array until EOF
while((scanf("%c",input)!= EOF)){

    //checks input for characters A-Z 
    if((input[i]>= 'A' && input[i]<= 'Z'))


       letters[input[i]] = 1;
    }

    //prints capital letters from input that occur at least once
for(i = 'A'; i < 'Z'; i++){
    if (letters[i]==1)
    printf("%c", i);}        // this output works fine, the scan worked??


//print blank line
printf("\n\n");


// print input
printf("%s\n", input);      //This is where the incorrect output comes from.  

return 0;}

元の入力は変更されますか? なぜ?そもそも私の入力が正しくスキャンされなかったのですか? 迅速に対応してください!

4

3 に答える 3

3

ここ:

while((scanf("%c",input)!= EOF)){

文字を に読み込むだけですinput[0]。これは、 に対して行っていることには問題ありませんがletters、 を印刷しようとするとinput、期待どおりに動作しないことは明らかです。

\0修正するときは、最後の入力文字の後に終端を追加することも忘れないでください。

于 2013-09-28T03:16:39.833 に答える
1

ループは入力を 1 文字ずつ読み取り、そのscanf1 文字を に格納しinput[0]ます。scanfループが完全に終了するとinput[0]、最後に読み取られた文字が含まれ、残りinputは変更されません。

修復するには、ループi++の最後に含める必要があります。scanf

ところで、入力バッファを単一の呼び出しで満たしてから、次のように入力バッファをfgetsループする方が明確 (かつ効率的) です。for (i=0; buf[i]!='\0'; i++) { ... }

于 2013-09-28T03:16:32.420 に答える
1

あなたがしなければならない

while((scanf("%c",&input[i])!= EOF))
{i++;}

これの代わりに

while((scanf("%c",&input)!= EOF))
{}

あなたがしているのは、毎回配列の最初の要素のアドレスに文字をスキャンしているため、何度も上書きされます。input[] 配列の残りの部分はアクセスされていないため、変更されません

于 2013-09-28T03:18:04.223 に答える