2016-11-06 3 views
2

以下のコードが誤っている理由を知ることができません。これは、*が入力されるか、配列のサイズに達するまで文字を受け入れ、キーボードから読み取った文字を出力する単純なコードです。読書部分は上手くいくようです。配列サイズに達する前に*を入力してもOKです。しかし、*入力せずに読み込み部分で配列サイズに達するまで待つと、問題があります。印刷中に読み取られた文字は印刷されますが、その後はいくらかのゴミが印刷されます。デバッガを使用して実行しますが、whileループはインデックスが3以上の場合は中断しません。ループが壊れていないとき

int main() 
{ 
    char myStr [3]; 
    unsigned int index=0; 
    printf("Enter Single characters. Enter * to stop\n"); 
    do 
    { 
     scanf(" %c",&myStr[index]); 
     index++; 
    } while ((myStr[index-1]!='*')&&((index)<(sizeof(myStr)/sizeof(myStr[0])))); 

    index=0; 

    while ((myStr[index]!='*')&&(index<(sizeof(myStr)/sizeof(myStr[0])))) 
    { 
     printf("%c",myStr[index]); 
     index++; 
    } 
    printf("\n"); 

    return(0); 
} 
+0

mystrのサイズは、[3]、おそらくそれを宣言して固定されていますか?その場合、商は配列の実際の文字数を表しません。 –

+0

@JeremyKahan:配列上で 'sizeof(myStr)/ sizeof(myStr [0])'を実行すると、要素数を計算するのに完全に有効です。 – alk

+0

@alkはい。しかし、ユーザーが3つを入力したかどうかにかかわらず、3つの要素があることを心配していました。しかし、ユーザーが星に入るか、3つ入力する必要があるので、今は問題ではないことがわかります。 –

答えて

2

コードはここにprintfループの最後の繰り返しに未定義の動作に動作します

while ((myStr[index]!='*')&&(index<(sizeof(myStr)/sizeof(myStr[0])))) 
    { 
     ... 

実際にはそれがmyStr[3]はへのアクセスに

while ((myStr[3] .... 

をやっているようは範囲外です。

while ((index < (sizeof(myStr)/sizeof(myStr[0]))) && (myStr[index] != '*')) 

Boolean short-circuitingが実行されていないmyStr[3]の世話をします。このDOを修正するには

+0

良い分析をいただきありがとうございます。範囲外の値の定義されていない動作になる:myStr [4]がガベージ値である可能性があることを理解しています。しかし、それは確かにいくつかのメモリの場所を指しているので、まだそれはいくつかの値を(私は思った)持っている必要があります。このような場合、最初の部分はTRUEまたはFALSEと評価されます。このような場合、コードは正しく動作するはずです。しかし、重要ではないメモリを読み取るだけでは、アプリケーションの誤動作を招く可能性があることは決してありませんでした。範囲外のメモリに書き込むと、システムの未定義の動作を理解できます。 – Rajesh

+0

明確化する:インデックス= 3のとき、2番目の部分がFALSEになるため、ループは入力されません。だからprintf()は正しい画像にならないのですか? – Rajesh

+0

インデックスを4から3に固定しました...:} – alk

0

あなたは文字列を操作していますが、魔法使いはnullで終了する必要があります。 fgets(3)を使用して文字列を取得し、次にstrlen(3)を使用して長さを取得する必要があります。 そして、あなたは しばらくして、文字列に移動することができる(STR [I]!= '*' & &私<のstrlen(文字列)) 幸運

+2

"*あなたは文字列を操作しています... *"いいえ、OPは 'char'配列を使用します。 C- "文字列"はありませんし、 'char'-arrayに依存する関数もC-文字列として使用されていません。 – alk

+0

私の悪い、私はchar *を見た – Glick

+0

'char'(' 'char *')へのポインタは何か変わるでしょうか? – alk

関連する問題