2017-03-20 2 views
0

코드 :변수 len이 정의 된 방법에 따라 출력이 다른 이유는 무엇입니까?

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

int main() { 
    int len = 3; // length of word 
    char * word = "cat"; // word to be sorted 
    char sortedWord[len]; 
    int i, j, temp; 
    // store chars from 'word' to an array 'sortedWord[]' 
    for (i = 0; i < len; i++) { 
     sortedWord[i] = *word; 
     word++; 
    } 

    // sort the array using bubble sort 
    for (i = 0; i < len - 1; i++) { 
     for (j = 0; j < len - i - 1; j++) { 
      if (sortedWord[j] > sortedWord[j + 1]) { 
       temp = sortedWord[j]; 
       sortedWord[j] = sortedWord[j + 1]; 
       sortedWord[j + 1] = temp; 
      } 
     } 
    } 
    printf("%s\n", sortedWord); 

} 

이 질문의 초점은 변수 '렌'입니다. len이 3과 같다고 정의한다면 출력은 예상대로입니다 (즉, "act"). 그러나 명시 적으로 정의하지 않고 길이를 찾을 수 있기를 원합니다.

int len = strlen (word); 

그러나, 출력이 예상과 :

나는대로 렌 정의하기 위해 노력했다. 그것은 actW?, actX?와 같은 결과를 나에게 줄 것입니다. 나는 인쇄 할 수 있다면

int len; 
for (len = 0; *word != '\0'; len++) { 
    word++; 
} 

놀랍게도, 그것을 정의 직후 명시 적으로 렌 변수, 그것은 또한 같은 방식으로 작동 것이다 : 나는대로 렌을 정의 할 때

이 같은 문제가 발생합니다.

int len = 3; 
printf("Length: %d\n", len); // will cause the output to be different 

나는 근본적인 개념이 빠져 있다고 확신하지만,이 문제를 해결하기위한 접근법에는 확신이 없습니다. 미리 감사드립니다!

+0

'의 printf ("% s의 \ 없음"이기 때문에 문자열 리터럴에 대한 포인터를 작성할 때, – BLUEPIXY

+0

@BLUEPIXY 대개 한 줄 힌트는 매우 유용하지만, 매우 불분명 함을 인정해야합니다 (예 : sortedWord); -> printf ("%. * s \ n", len, sortedWord); –

+1

이것은 널 문자 종료가 필요 없음을 의미합니다. BLUEPIXY는 내가 당신과 동의해야 할 때마다 그 자리를 때린다. :) –

답변

1

귀하의 storeWord정의되지 않은 동작null 터미네이터를 추가 원인이 종료되지 null되고 더 이상 비정상적으로 작동하지 않습니다.

또한 word 포인터를 증가 시키면 원래 문자열의 종결 자 null을 가리 키므로 그렇게하지 마십시오. 대신 색인을 사용하여 요소에 액세스하십시오.

char sortedWord[len + 1]; // One more for the '\0' 
int i, j, temp; 
// store chars from 'word' to an array 'sortedWord[]' 
for (i = 0; i < len; i++) { 
    sortedWord[i] = word[i]; 
} 
storeWord[len] = '\0'; 

한 가지 더, 그들을 개질시키기 실수 방지하기 위해 const를 사용, 즉 정의되지 않은 동작이 너무 너무

const char *word = "cat"; 
+0

나는 원래 포인터 ('word')를 증가시키는 대신, 그것의 사본을 증가 시키거나 색인을 붙이는 대신 조심할 것이다. –

+1

@WeatherVane 또는 do'sortedWord [i] = word [i]' –

+0

편집이 더 좋습니다. –

관련 문제