2013-05-21 3 views
3

내 코드에 따라 각 그리스 문자가 2 바이트로 저장된다고 가정합니다. sizeof 반환 4 각 문자의 크기 (즉 sizeof의 int)sizeof 문자 및 strlen 문자열 불일치

어떻게 strlen 반환 16합니까? [각 문자가 2 바이트를 차지한다고 생각하게해라] (4 * 8 = 32는 바이트 수를 계산해야하기 때문에)

각 문자를 올바르게 인쇄하는 방법은 무엇입니까? %c 때문에 1 바이트 (문자)를 읽지 않아야하는데, 왜이 경우 그리스 문자가 분할되지 않습니다.

strcpy(bigString,"ειδικούς");//greek 
sLen = strlen(bigString); 
printf("Size is %d\n ",sizeof('ε')); //printing for each character similarly 
printf("%s is of length %d\n",bigString,sLen); 
int k1 = 0 ,k2 = sLen - 2; 

for(i=0;i<sLen;i++) 
printf("%c",bigString[i]); 

출력 : C에서

Size is 4 
ειδικούς is of length 16 
ειδικούς 

답변

10
  1. 캐릭터 리터럴 입력 int있을 정도로 sizeof('ε')sizeof(int)는 동일하다. 이 성명서에서 불을 가지고 놀고 있습니다. 'ε'멀티 문자가 리터럴이며 표준이 아니기 때문에 다시 물러날 수 있습니다. 이와 같은 확장 프로그램 사용에는주의하십시오. 예를 들어, Clang은이 프로그램에서 그 문자 그대로 그 프로그램을 받아들이지 않을 것입니다. GCC는 경고를 주지만 여전히 컴파일 할 것입니다.

  2. strlen은 널 종결 자 앞에있는 문자열의 바이트 수이기 때문에 16을 반환합니다. 귀하의 그리스어 문자는 UTF-8로 긴 16 비트, 그래서 당신의 문자열과 같이 보입니다 : c0c0, 예를 들어, 첫 번째 문자의 두 바이트 메모리에

    c0c0 c1c1 c2c2 c3c3 c4c4 c5c5 c6c6 c7c7 0 
    

    을. 문자열에 null-termination 바이트가 하나 있습니다.

  3. printf은 터미널이 UTF-8을 인식하기 때문에 작동하는 것처럼 보입니다. 으로 각 바이트를 별도로 인쇄하지만 터미널은 첫 번째 두 개의 인쇄물을 단일 문자로 해석하는 식입니다.

    printf("%d: %02x\n", i, (unsigned char)bigString[i]); 
    

    당신은 당신이 기대하고있는 바이트 단위로 동작을 볼 수 있습니다 : 당신은 printf 호출에 있음을 변경하는 경우.

+0

왜 'strlen'이 '16'을 제공합니까? 4 * 8 = 32를주는'int' 타입의 8 문자가 있어야합니까? –

+0

아니요. 문자 리터럴은 'int'입니다. 문자열의 문자는 필요한 크기 여야합니다 - 귀하의 경우에는 각각 2 바이트처럼 보입니다. –

+0

btw, visualof 스튜디오에서 sizeof ('ε') 인쇄 ... 그리고 어느 쪽이든이 'ε'은 문자열 리터럴이 아니라 char 리터럴입니다. –