2016-12-13 15 views
0

文字配列substring[#][64]に設定されている場合、ファイルは追加文字を出力します。追加文字は各コンパイルによって異なります。場合によってはes?、時にはesxなどがあります。C無関係/宣言されていない変数が別の変数の出力に影響するのはなぜですか?

[64]を他の番号(少なくとも試したもの:65、256,1 ..)に変更すると、正しく出力されるのはesです。

私は、このファイル内の未使用/未申告の文字配列char newString[64]を残す場合はさらに奇妙な、それも64

  1. どのように64の一見任意のサイズはアウトには影響しないと正しいサブesを出力?
  2. 完全に無関係な文字配列(newString)は、他の文字配列の出力にどのような影響を与えますか?

int main() { 
    char string[64];  
    char newString[64]; 
    char substring[64]; 

    fgets(string,64,stdin); 
    strncpy(substring, string+1, 1); 
    printf("%s\n", substring); 

    return 0; 
} 
+1

'strncpy'の正しい使い方に注意してください。終了ゼロを付加しません。サブストリングを別のサブストリングから "抽出"すると思われるかのように見えます。 – usr2564301

+3

プログラムに未定義の動作があります。あなたの質問の全前提は間違っています - UBの行動についての説明を求める要点はありません。あなたの質問は、私のコードのバグはどこにあるべきですか?その答えはおそらく 'strncpy(substring、string + 1、1)'です。 'string + 1'は文字列バッファ全体をスキップし、その後ろのバイトを指します。また、1バイトだけをコピーして文字列として印刷しようとします。 – kaylum

+0

入力は何ですか? – chux

答えて

3

問題は、あなたがいないためにそれを求めてきましたので、strncpy()nullターミネータをコピーしません、です。それは常にnullターミネータをコピーしませんので、strncpy()を使用して

は、同時に安全と危険です、また、単一バイトのためにそれを使用すると、代わりにこの

substring[0] = string[1]; 
substring[1] = '\0'; 

を行うと、それが動作するものと、無意味です。

短い時間でより良いプログラマになるたびにマニュアルを慎重に読んだら、正しいことを理解するためにマニュアルページstrncpy(3)を読むべきです。

+1

実際の文字列の終わり(おそらく意図しない)の後に文字を引き継がないように、文字列の長さが少なくとも2であるかどうかをテストすることをお勧めします。例えばif(strlen(string)> = 2)部分文字列[0] =文字列[1] else部分文字列[0] = '\ 0'; –

+0

@StephanLechnerチェックするのは非常に良い習慣ですが、コメントが十分であるため、私は答えを変更しません。 –

関連する問題