次のコードスニペットは、TurboC++コンパイラで予期しない出力を提供します。
char a[]={'a','b','c'};
printf("%s",a);
なぜこの印刷されないのabc
ですか?私の理解では、文字列はCでは1次元の文字配列として実装されています。次に、と
の違いは何ですか?%s
%2s
次のコードスニペットは、TurboC++コンパイラで予期しない出力を提供します。
char a[]={'a','b','c'};
printf("%s",a);
なぜこの印刷されないのabc
ですか?私の理解では、文字列はCでは1次元の文字配列として実装されています。次に、と
の違いは何ですか?%s
%2s
これは、文字列がゼロで終了していないためです。これはうまくいきます:
char a[]={'a','b','c', '\0'};
は、印刷出力の%2s
最小幅を指定します。3 文字の文字列を出力しているため、これは無視されます。ただし、を使用%5s
すると、文字列の左側に 2 つのスペースが埋め込まれます。
char a[]={'a','b','c'};
問題の 1 つは、文字列を null で終了する必要があることです。
char a[]={'a','b','c', 0};
元の文字配列を変更せずに使用することもできます
char a[]={'a','b','c'};
printf("%.3s",a);
or
char a[]={'a','b','c'};
printf("%.*s",sizeof(a),a);
or
char a[]={'a','b','c'};
fwrite(a,3,1,stdout);
or
char a[]={'a','b','c'};
fwrite(a,sizeof(a),1,stdout);
文字列を使用していないためです。文字列と見なされるには、'null 終端': '\0' または 0 (はい、引用符なし) が必要です。
これは、次の 2 つの形式の初期化によって実現できます。
char a[] = {'a', 'b', 'c', '\0'};
またはあなたの側でコンパイラを使用して:
char a[] = "abc";