これにより、セグメンテーションエラーが発生します。何を修正する必要がありますか?
int main(void)
{
char a_static = {'q', 'w', 'e', 'r'};
char b_static = {'a', 's', 'd', 'f'};
printf("\n value of a_static: %s", a_static);
printf("\n value of b_static: %s\n", b_static);
}
投稿されたコードは正しくありません:a_static
およびb_static
は配列として定義する必要があります。
コードを修正するには2つの方法があります。
nullターミネータを追加して、これらの配列を適切なC文字列にすることができます。
#include <stdio.h>
int main(void) {
char a_static[] = { 'q', 'w', 'e', 'r', '\0' };
char b_static[] = { 'a', 's', 'd', 'f', '\0' };
printf("value of a_static: %s\n", a_static);
printf("value of b_static: %s\n", b_static);
return 0;
}
または、printf
は、精度フィールドを使用して、nullで終了しない配列の内容を出力できます。
#include <stdio.h>
int main(void) {
char a_static[] = { 'q', 'w', 'e', 'r' };
char b_static[] = { 'a', 's', 'd', 'f' };
printf("value of a_static: %.4s\n", a_static);
printf("value of b_static: %.*s\n", (int)sizeof(b_static), b_static);
return 0;
}
.
の後に指定される精度は、文字列から出力する最大文字数を指定します。 10進数または*
として指定でき、int
ポインターの前にchar
引数として指定できます。
これはセグメンテーションフォールトになります。?以下のステートメントのため
char a_static = {'q', 'w', 'e', 'r'};
a_static
は、複数の文字を保持するためにchar array
にする必要があります。のようにする
char a_static[] = {'q', 'w', 'e', 'r','\0'}; /* add null terminator at end of array */
b_static
についても同様
char b_static[] = {'a', 's', 'd', 'f','\0'};
宣言する代わりに配列を使用する必要があります
a_static
b_static
変数として
そのため、次のようになります。
int main()
{
char a_static[] = {'q', 'w', 'e', 'r','\0'};
char b_static[] = {'a', 's', 'd', 'f','\0'};
printf("a_static=%s,b_static=%s",a_static,b_static);
return 0;
}
問題は、Cスタイル文字列を使用していることであり、Cスタイル文字列はゼロで終了します。たとえば、char配列を使用して「エイリアン」を出力する場合:
char mystring[6] = { 'a' , 'l', 'i', 'e' , 'n', 0}; //see the last zero? That is what you are missing (that's why C Style String are also named null terminated strings, because they need that zero)
printf("mystring is \"%s\"",mystring);
出力は次のようになります。
mystringは「エイリアン」です
コードに戻ると、次のようになります。
int main(void)
{
char a_static[5] = {'q', 'w', 'e', 'r', 0};
char b_static[5] = {'a', 's', 'd', 'f', 0};
printf("\n value of a_static: %s", a_static);
printf("\n value of b_static: %s\n", b_static);
return 0;//return 0 means the program executed correctly
}
ところで、配列の代わりにポインターを使用できます(文字列を変更する必要がない場合):
char *string = "my string"; //note: "my string" is a string literal
また、文字列リテラルを使用してchar配列を初期化することもできます。
char mystring[6] = "alien"; //the zero is put by the compiler at the end
また、Cスタイル文字列(たとえば、printf、sscanf、strcmp、strcpyなど)で動作する関数は、文字列の終了位置を知るためにゼロを必要とします
この答えから何かを学んだことを願っています。