2016-09-04 4 views
2

리버스 수 있습니까 반대하는 간단한 프로그램을 만든 C에서 문자열을 여기에 내 코드입니다 :C는 : 문자의 배열이 아닌 문자열

#include <stdio.h> 

    int main(){ 
      char istring[] = {'f','o','o','b','a','r'}; 

      char revstring[sizeof(istring)]; 

      for(int i = 0; i < sizeof(istring); i++){ 
        int cplace = sizeof(istring)-i-1; 
        revstring[cplace] = istring[i]; 
      } 
      printf("%s",revstring); 
      return 0; 
    } 

raboof을 예상대로 내 결과입니다.

이제 char istring[] = "foobar";으로 char istring[] = {'f','o','o','b','a','r'};을 교환하면 아무 것도 출력되지 않습니다. 뭐가 문제 야?

미리 감사드립니다.

는 C에서

답변

3

(이 총 초보자 질문 인 경우 죄송합니다), 문자열은 문자의 널 종료 배열입니다. 원래 프로그램에서 istring은 문자열이 아니며 끝에 null 바이트가없는 문자 배열입니다.

성공적으로 문자를 반대로 표시하는 경우 끝에 null 바이트가 없기 때문에 revstring은 문자열이 아닙니다. 따라서 printf에 대한 %s 형식 지정자를 사용하여 문자열로 인쇄하려고하면 배열 끝을 지나서 검색합니다. 배열 범위를 넘어서는 읽기는 undefined behavior입니다.

정의되지 않은 동작은 프로그램이 제대로 작동하는 것처럼 보일 수 있습니다. 당신의 경우에, 당신은 "행운"을 얻었고 기대되는 결과를 얻었습니다.

istringistring[] = "foobar";으로 정의하면 널 종결 바이트가 포함 된 문자열 상수로 초기화됩니다. 따라서이 정의는 실제로 이전 바이트보다 1 바이트 더 큽니다.

문자를 반대로하면 실제로 null 바이트가 포함됩니다. 결과 배열은 널 (null) Y이트와. 자 앞에 다른.자를 포함합니다. 그런 다음 인쇄 할 때 null 바이트가 먼저 표시되므로 사용자가 가지고있는 것은 빈 문자열입니다.

루프에서 sizeof(istring) 대신 strlen(istring)을 상한으로 사용하십시오. 그런 다음 끝에 null 바이트를 추가하십시오.

char istring[] = {'f','o','o','b','a','r'}; 
char revstring[sizeof(istring)+1]; 

for(int i = 0; i < sizeof(istring); i++){ 
    int cplace = sizeof(istring)-i-1; 
    revstring[cplace] = istring[i]; 
}  
revstring[sizeof(istring)] = '\0'; 
4

sizeof "foobar"이 하지 됩니다 : 당신은 문자의 배열로 istring을 정의하면 상한 검사 할 때

char istring[] = "foobar"; 
char revstring[sizeof(istring)]; 

for(int i = 0; i < strlen(istring); i++){ 
    int cplace = strlen(istring)-i-1; 
    revstring[cplace] = istring[i]; 
} 
revstring[strlen(istring)] = '\0'; 

, 당신은 revstring에 추가 바이트를 할당하고 sizeof을 유지할 필요 6. C 문자열은 '\0' 문자로 NUL 종료됩니다.

NUL이 문자열을 종료하지 못하기 때문에 첫 번째 예제가 작동하므로 'r''f'이 바뀝니다. 역행 된 문자열 인 다음의 주소 공간이을 0으로 평가하여 ('\0'과 같음) 문자열을 종료한다는 점에서 운이 좋을 것입니다. 그렇지 않으면 종료되지 않은 문자열을 인쇄하면 정의되지 않은 동작이 호출됩니다. "foobar"

'f''\0'가 교환되고, 당신의 결과 C 문자열을 효율적으로 제로 길이 될 것입니다.

strlen을 사용하여 문자열의 길이를 얻으십시오. sizeof은 메모리 블록의 길이가 아닙니다. string.h 헤더를 포함해야합니다.

char str[] = "foobar"; 
size_t str_len = strlen(str); 

char rev[str_len + 1]; 
rev[str_len] = '\0'; 

for (int i = 0; i < str_len; i++) 
    rev[i] = str[str_len - i - 1]; 

printf("%s\n", rev); 
관련 문제