programing

C char 배열 초기화

kingscode 2022. 8. 25. 22:09
반응형

C char 배열 초기화

다음과 같은 방법으로 초기화 후 char 배열에 무엇이 포함될지 알 수 없습니다.

1.char buf[10] = "";
2. char buf[10] = " ";
3. char buf[10] = "a";

는 2번이라고 합니다.buf[0]should be ' ',buf[1]should be '\0'、 , , buf[2]로로 합니다.buf[9]랜덤 컨텐츠가 됩니다.는 3번이라고 합니다.buf[0]should be 'a',buf[1]에서 '\0'으로 .buf[2]로로 합니다.buf[9]랜덤 컨텐츠가 됩니다.

그것이 맞습니까?

1번 는 '1번 케이스'에 뭐가 ?buf무슨 일입니까?buf[0] == '\0' 및서에서buf[1]로로 합니다.buf[9]덤덤컨 컨텐? ???

이는 어레이를 초기화하는 방법이 아니라 다음을 위한 것입니다.

  1. 첫 번째 선언:

    char buf[10] = "";
    

    와 동등하다

    char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
  2. 두 번째 선언:

    char buf[10] = " ";
    

    와 동등하다

    char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
  3. 세 번째 선언:

    char buf[10] = "a";
    

    와 동등하다

    char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    

랜덤 콘텐츠는 .이니셜라이저가 부분은 "하다"로 됩니다.인테셜라이저가 적을 경우 어레이의 나머지 부분은 다음과 같이 초기화됩니다.0이는 함수 내에서 어레이가 선언되어 있는 경우에도 마찬가지입니다.

  1. 이것들은 동등하다.

    char buf[10] = "";
    char buf[10] = {0};
    char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
  2. 이것들은 동등하다.

    char buf[10] = " ";
    char buf[10] = {' '};
    char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
  3. 이것들은 동등하다.

    char buf[10] = "a";
    char buf[10] = {'a'};
    char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    

편집: OP(또는 에디터)는 이 답변을 제공한 후 원래 질문의 작은 따옴표 중 일부를 큰 따옴표로 자동 변경했습니다.

코드로 인해 컴파일러 오류가 발생합니다.첫 번째 코드 조각:

char buf[10] ; buf = ''

이중으로 불법이다.첫째, C에는 빈칸이 없다.char 하여 빈할 수 큰따옴표를 사용하여 다음과 같이 빈 문자열을 지정할 수 있습니다.

char* buf = ""; 

that that a a to to to to to to to to에 대한 가 됩니다.NUL 즉 ", "1"만 NUL캐릭터가 등장.단, 정의되어 있지 않은 작은 따옴표는 사용할 수 없습니다.를 지정할 NUL문자를 지정해야 합니다.

char buf = '\0';

는 문자에서 을 없애기 위해 합니다.'0'

char buf = 0;

같은 것을 달성하지만, 전자가 읽기에는 조금 덜 애매한 것 같아요.

둘째, 어레이를 정의한 후에는 초기화할 수 없습니다.

char buf[10];

는 배열을 선언하고 정의합니다. " " " "buf내의 이할 수 .buf배정을 통해 점수를 획득합니다. ★★★★★★★★★★★★★★★★★.

buf =     // anything on RHS

불법입니다.따라서 두 번째 및 세 번째 코드 조각은 불법입니다.

어레이를 초기화하려면 정의 시점에 어레이를 초기화해야 합니다.

char buf [10] = ' ';

첫 .'\040'그리고 나머지는NUL ,contrace,'\0'언제 배열 및 이니셜 라이저로 정의된로 선언된다., 배열 요소 지정된 초기 값을 사용하는 사람들을 지나 자동으로 이니셜라이저를 사용하여 어레이를 선언하고 정의하면 지정된 초기값을 가진 어레이 요소(있는 경우)가 자동으로 패딩됩니다로 패드가 대어져 있( 있는 경우).0.도 생기지 않을 것"무작위 콘텐츠".

다음과 같이 어레이를 선언하고 정의하지만 초기화하지 않는 경우:

char buf [10];

모든 요소에 랜덤한 내용이 포함됩니다.

C11 표준 드래프트 n1570 6.7.9 초기화 관련 부분에는 다음과 같이 기재되어 있습니다.

14 문자열 리터럴 또는 UTF-8 문자열 리터럴에 의해 문자 타입의 배열을 초기화할 수 있습니다(옵션으로 중괄호로 묶음).문자열 리터럴의 연속 바이트(공간이 있거나 배열 크기를 알 수 없는 경우 끝의 늘 문자 포함)에 따라 배열 요소가 초기화됩니다.

그리고.

21 괄호로 둘러싸인 리스트 내의 이니셜라이저가 애그리게이트의 요소 또는 멤버의 수보다 적거나, 기존의 크기의 배열을 초기화하기 위해 사용되는 문자열 리터럴 내의 문자가 어레이 내의 요소보다 적을 경우, 애그리게이트의 나머지 부분은 정적 기억시간을 갖는 객체와 암묵적으로 동일하게 초기화되어야 한다.

따라서 공백이 충분할 경우 '\0'이 추가되고 나머지 문자는 다음 값으로 초기화됩니다.static char c;함수 내에서 초기화되게 될까요..

마침내.

10 저장 기간이 자동인 객체가 명시적으로 초기화되지 않은 경우, 그 값은 불확실하다.정적 또는 스레드 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우:

[--]

  • 산술 유형이 있는 경우 (양수 또는 부호 없음) 0으로 초기화됩니다.

[--]

따라서,char배열의 나머지 또한 0을 사용하여 초기화될 지를 보장하는 교육자가 되는 것은 산술 형태이다.

확실하지는 않지만 일반적으로 어레이를 "로 초기화합니다.이 경우 문자열의 늘 끝은 걱정할 필요가 없습니다.

main() {
    void something(char[]);
    char s[100] = "";

    something(s);
    printf("%s", s);
}

void something(char s[]) {
    // ... do something, pass the output to s
    // no need to add s[i] = '\0'; because all unused slot is already set to '\0'
}

이런 망할 흥미롭게도, 그것은 어떤 방법으로도 그 프로그램에 언제든지 배열 초기화한다면, 가능하다 그들은 회원들struct또는union.

프로그램 예:

#include <stdio.h>

struct ccont
{
  char array[32];
};

struct icont
{
  int array[32];
};

int main()
{
  int  cnt;
  char carray[32] = { 'A', 66, 6*11+1 };    // 'A', 'B', 'C', '\0', '\0', ...
  int  iarray[32] = { 67, 42, 25 };

  struct ccont cc = { 0 };
  struct icont ic = { 0 };

  /*  these don't work
  carray = { [0]=1 };           // expected expression before '{' token
  carray = { [0 ... 31]=1 };    // (likewise)
  carray = (char[32]){ [0]=3 }; // incompatible types when assigning to type 'char[32]' from type 'char *'
  iarray = (int[32]){ 1 };      // (likewise, but s/char/int/g)
  */

  // but these perfectly work...
  cc = (struct ccont){ .array='a' };        // 'a', '\0', '\0', '\0', ...
  // the following is a gcc extension, 
  cc = (struct ccont){ .array={ [0 ... 2]='a' } };  // 'a', 'a', 'a', '\0', '\0', ...
  ic = (struct icont){ .array={ 42,67 } };      // 42, 67, 0, 0, 0, ...
  // index ranges can overlap, the latter override the former
  // (no compiler warning with -Wall -Wextra)
  ic = (struct icont){ .array={ [0 ... 1]=42, [1 ... 2]=67 } }; // 42, 67, 67, 0, 0, ...

  for (cnt=0; cnt<5; cnt++)
    printf("%2d %c %2d %c\n",iarray[cnt], carray[cnt],ic.array[cnt],cc.array[cnt]);

  return 0;
}

문자열 등을 사용할 때는 아래 형식을 사용합니다.

#include <stdio.h>
#include <string.h>



void func(char *str)
{
       char str1[50]={'\0'};
       int length=0;           
        
       if ((strlen(str) + 1) > 50)
                fprintf(stderr, "string too long\n");
       else if (str == NULL)
                fprintf(stderr, "Invalid pointer\n");
       else {
                memcpy(str1, str, strlen(str) + 1);
                if(*str1 == '\0' )
                        fprintf(stderr, "Invalid string\n");
                else         
                        printf("--> %s\n", str1);
               
                memset(str1 ,'\0' , strlen(str1) + 1);
                str=NULL;
       }
}

int main()
{
        func("this is my string");
        return 0;
}

언급URL : https://stackoverflow.com/questions/18688971/c-char-array-initialization

반응형