2013-05-26 10 views
1

봐 호출 될 때 추가됩니다는 strcat와 다음 코드에서

char chs[100] = "Hello World"; 
char token[100]; 
int pos = -1; 
while((current = chs[++pos]) != '"'){ 
     strcat(token, &current); 
} 

을하지만 출력은 다음과 같습니다

H\001e\001l\001l\001o\001 \001W\001o\001r\001l\001d 

어떤 아이디어?

+0

@mbratch 결과가 Hello World가되어야합니다. – Foredoomed

+0

@Foredoomed 문자열 리터럴을 둘러싼 따옴표를 제거하려고합니까? 따옴표는 실제로 문자열의 일부가 아닙니다! 아마 [책] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)을 읽어야합니다. – Praetorian

+0

@Foredoomed,하지만 이것은 단지'chs'에서'token'까지의 문자열 복사라고 생각합니까? 그렇다면'strcpy'가 그 것이다. 당신은'strcpy (token, chs);'를 실행하고 끝낼 것이다. 루프가 필요하지 않습니다. 또는 다른 목적이 있습니까? 'strcat'을 사용하고 싶다면, 두 문자열 매개 변수가 모두 0으로 끝나야합니다. 그래서 적어도 토큰 [0] = '\ 0'을 루프 앞에서 시작하도록 설정해야 할 것입니다. – lurker

답변

2

strcat와 보이는이 입력의로 null로 끝나는 문자열을 필요로한다. 그래서 strcat (토큰, & 현재)는 현재 주소에서 읽기를 시작하고 널 (null)을 찾을 때까지 계속 진행합니다. 우연히, 현재의 메모리가 "\ 001"이었기 때문에 strcat을 할 때마다 모든 것을 토큰으로 복사했습니다.

char current [] = "\ 0 \ 0"을 수행 한 다음 current [0] = chs [++ pos]로 지정해야합니다. 그런 식으로 전류가 항상 null 종료됩니다. 이 코드의 작업 버전입니다

2

당신은 당신의 current가 선언되지 않기 때문에 행동

정의되지 않은 한, 나는 그것이 일부 초기화되지 않은 문자입니다 같은데요. current = chs[++pos])은 문자를 설정하지만 strcat(token, &current);current을 문자열로 지정해야하므로 변수 current 뒤에 일부 정크가 저장됩니다.

추가 분석을

에 대한 샘플 코드의 자세한 내용을 게시주십시오 BTW '"'()는 잘못된 C에게

0

만들기 최소한의 변경 :

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

int main() 
{ 
    char current[2] = { 0x0, 0x0 }; // Will be null terminated 
    char chs[100] = "Hello World"; 
    char token[100] ; 
    int pos = -1; // Destination of strcat must also be null terminated 

    token[0] = '\0' ; 

    // String literals does not actually have " in memory they end in \0 
    while((current[0] = chs[++pos]) != '\0') 
    { 
      strcat(token, &current[0]); // Take the address of the first char in current      
    } 

    printf("%s\n", token) ; 

    return 0 ; 
} 

strcat 소스 및 대상이 null로 끝나는 문자열이 될 것으로 기대하고있다. 귀하의 경우에는 current이 방금 \001으로 끝나고 그 다음에 메모리에 널 종료자가 오는 것 같습니다.