2017-07-22 12 views
0

Cで文字列を入力して印刷しようとしています。私のサンプルコードは以下の通りである:問題がある固定長文字列をCの入力として受け取ります

#include<stdio.h> 
main() 
{ 
    char a[5]; 
    scanf("%[^\n]a",a); 
    printf("%s",a); 

} 

、私は当初5として文字列の長さを想定している。しかし、私は5以上の長さの文字列を取る場合、それが正常に動作します。なぜこうなった?許可された文字列の長さは5未満であってはなりませんか?

+0

「*どうしてですか?*」未定義の動作は未定義です。 "*許可される文字列の長さは*"誰に許可されていないのですか? 'a 'の第1要素のアドレスを' scanf() 'に(暗黙的に)渡します。どのくらいスキャンするかを明示的に伝える必要があります。 – alk

+0

私はchar a [5]を宣言すると、これは実際には何を意味していますか? @alk – user5411115

+1

また、 'a'はfloatをスキャンします。 "文字列"をスキャンするには 's'を使います。 5-1 = 4の長さの文字列を可能にする 'char [5]'を定義している場合。 Cは "文字列"の '0'ターミネータを格納するために' char'を1つ必要とします。 'scanf()'に4つの 'char'をスキャンするように指示するには'%4s'を使います。 – alk

答えて

2

どうしてですか?

"未定義の動作は未定義である。"

は許可された文字列の長さが5未満ではないでしょうか?

許可されていますか? aの1番目の要素のアドレスをscanf()に(暗黙的に)渡します。どのくらいスキャンするかを明示的に伝える必要があります。

aはフロートをスキャンします。 「文字列」をスキャンするには、sを使用します。

char[5]を定義して、長さ5-1 = 4の可能な "文字列"を許可する場合は、 Cは1文字「0 -terminator」を格納するには1 charが必要です。

scanf()には、4 charのスキャンのみを指示します。%4s

+2

角括弧の後には's'は、それ自体で変換指定子です。ここでの 'a 'は、マッチングに失敗するリテラル文字として解釈されます。 – interjay

+2

おそらく 'scanf("%4 [^ \ n] "、a);'が必要です。 '%s'はスペースをスキップします。また、 'scanf'からの戻り値をチェックすることにも言及する価値があります。 –

+1

もっと良い考え方:決して' scanf'を使用しないでください。 – melpomene

関連する問題