web-dev-qa-db-ja.com

printfを使用してCでchar配列を印刷する方法は?

これにより、セグメンテーションエラーが発生します。何を修正する必要がありますか?

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);
}
5
Aquarius_Girl

投稿されたコードは正しくありません: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引数として指定できます。

10
chqrlie

これはセグメンテーションフォールトになります。?以下のステートメントのため

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'};
1
Achal

宣言する代わりに配列を使用する必要があります

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;
}
0
Karthik Vg

問題は、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など)で動作する関数は、文字列の終了位置を知るためにゼロを必要とします

この答えから何かを学んだことを願っています。

0
NotMe