0

ptr char 配列に値を挿入できません:

int main() {

  char S[MAX_STRING_LENGTH],*str;

  int total,j=0,i=0;
  char ptr[16],c;

    scanf("%d",&total);

      for(i=0;i<total;i++){
          c=getchar();
           do{

           ptr[j]=(char)tolower(c);
           j++;
           c=getchar();
           }while(c!='\n' && j<15 );

           ptr[j]='\0';
           printf("j=%d , %s",j,ptr);
           }

}

私が知っているこの理由:

do-loop exit を '\n' に配置し、合計で値を挿入した後に enter('\n') 自体を使用しています。そうすれば、値を挿入せずにループを終了します。

どうすれば修正できますか?

4

3 に答える 3

2

あなたがしていることは一種の安全ではありません。まず、オペレーティング システムによっては、'\n' だけでなく '\r' で終了する必要がある場合があります。次に、入力のサイズが 15 シンボル以内であることを確認しません。ゼロ終端文字のために 1 つのセルを残すことは通常良い習慣であるため、15 個の記号と言うことに注意してください。

入力に空白(スペースまたはタブ)が含まれていない場合は、scanf("%s")エラーが発生しにくいため、使用することをお勧めします。また、while ループが不要になります。

そうでない場合は、「\r」のチェックも追加する必要があります。また、合計値の後に入力した改行文字を削除する必要があります。そのようです:

scanf("%d", &total);
getchar();

そうしないと、合計の後の改行が while ループで読み取る最初の文字になり、サイクルの最初の反復で終了するため、これが必要です。

プログラムをデバッグすると、これが発生することがわかります。

于 2012-12-26T09:30:32.010 に答える
2

scanf入力ストリームをスキャン\nしましたが、に保存しなかったためです&total。次回はgetchar()それを取得する\nため、do-while は 1 回しか実行できません。
追加

getchar();

scanfの後。

入力ストリーム:

            the next you getchar() will from here
             |
             | 
A A A A A A \n A A A A A A
          ^
          |
  the variable total store string before this        
于 2012-12-26T09:20:43.740 に答える
0

scanf の実行中に no(no of characters) と入力して 10 と入力し、Enter キーを押します。この '\n\ は scanf によって読み取られず、入力ストリームにあります。最初の反復中に、getchar() はこの '\n' を読み取り、最初の反復後にループを終了します。したがって、入力ストリームを空にしないように、scanf() の後に getchar() を配置することをお勧めします。これから離れて、

配列インデックスの制限を超えてチェックを入れていません。ユーザーが文字を入力し続けて、16 桁を超えて挿入しようとする場合があります。

 while(c != '\n' && j < 15);

あなたの問題を解決します。

于 2012-12-26T09:26:48.233 に答える