2014-07-09 2 views
0

방금 ​​C 언어를 배우기 시작했습니다. 내 코드는 문자열에서 짧은 형태의 알파벳 (a-z 또는 A-Z) 또는 숫자 (0-9)를 찾은 다음이를 확장합니다 (abcd..z 등).왜 C에서 문자열 끝에 이상한 기호가 추가 되었습니까?

하지만 문제가 발생했습니다. 문자열 끝에 이상한 기호가 추가되었습니다. 이걸 알아낼 수있게 도와 주실 수 있겠습니까?

코드와 결과를 참조하십시오 : http://codepad.org/4sfBZv48

코드 :

당신은 당신의 문자열에서 터미네이터를위한 공간을 떠날 필요가
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 

char str[16] = "--g-6hA-Za-z56-9"; 
char exstr[127]; 
int lasti = 0; 

int i; 
int j; 
int start; 

for(i = 0; str[i] != 0; i++){ 

    if(str[i] > 64 && str[i] < 91 && str[i+1] == '-' && str[i+2] > 64 && str[i+2] < 91){ 

    }else if(str[i] > 96 && str[i] < 123 && str[i+1] == '-' && str[i+2] > 98 && str[i+2] < 123){ 

    }else if(str[i] > 47 && str[i] < 58 && str[i+1] == '-' && str[i+2] > 47 && str[i+2] < 58){ 

    }else{ 
     exstr[lasti++] = str[i]; 
     continue; 
    } 

    start = i; 
    i += 2; 
    for(j = str[start]; j <= str[i]; j++) 
     exstr[lasti++] = j; 
} 

printf("%s\n",exstr); 
return 0; 
} 
+0

'exstr [lasti] = 0; 'printf' 호출 전에. – ach

+0

이 문자열 exstr의 초기화를 볼 수 없으며 실제로는 exstr [lasti] = '\ 0'이 (가) –

+0

BTW'str [i + 2] '배열의 범위를 초과 할 수 있습니다. – BLUEPIXY

답변

2

은 널 종료된다 OK이어야한다. 그것은 here on wikipedia

그래서 당신이 제로 터미네이터의 끝 부분에 공간을 떠날 필요에 대해

자세히 알아보십시오.

char str[17] = "--g-6hA-Za-z56-9"; /* here the compiler is so kind to insert the null terminator for you */ 

또는 쿠엔틴 같은

컴파일러 그림은 모두 밖으로 마지막 요소로 배치하는 다른 사람이 대답했다, 당신은 null 종결을위한 공간을 떠나지 않았다

char str[] = "--g-6hA-Za-z56-9"; /* here the compiler is so kind to insert the null terminator for you and figure out the length */ 
+2

더 나은 점은 컴파일러가 빈칸으로 적절한 크기를 추론하도록하십시오. – Quentin

2

- 여기 당신이 다음은 문자 [16]로 정의 0..15 위치에 16 개의 문자를 넣으십시오. 따라서 널 종결자가 여유 공간이 없는지 확인하십시오.

는 숯 [17]으로 정의 할 경우에는 C 문자열에서

+0

와우 .. 나는 그것을 몰랐다. 고맙습니다! – Unfairnessrulestheworld

0

그 자체로하자 제안 STR

결과가 당신이 당신의 루프 반복 과거의 ​​"끝"계속 같이 일이 끝나는 무엇

(또는 오히려 당신이 끝을 것으로 예상 무엇을) STR [I] 이후 STR의 0과 같지

않습니다

str (NULL 종료로 표시됨)의 끝을 검사해야했던 for 루프의 조건을 만족하는 메모리에 도달 할 때까지 반복됩니다.

관련 문제