2017-01-09 3 views
1

누구나 문자열로 복사하는 방법을 알고 있습니까? 왜냐하면 strcpy 함수를 사용했기 때문에 결과를 출력 할 때 이상한 문자가 표시됩니다. 나는 '이름'+ '@'+ '전자 메일'을 연결하고자합니다. scanf를 사용하면 문자 'null'을 넣어야합니다.벡터 문자 이상한 문자

#include <stdio.h> 
#include <string.h> 
int main(){ 

    char message[150]; 
    char name[150]; 
    char mail[150]; 
    char result[150]; 
    printf("Introduce name: \n"); 
    scanf("%s",message); 
    printf("Introduce email \n"); 
    scanf("%s",server); 
    strcpy(result,message); 
    result[strlen(result)]='@'; 
    strcpy(&result[strlen(result)],server); 
    printf("RESULT: %s\n",result); 
    return 0; 
} 
+3

'결과 [나 strlen (결과)] = '@', '캐릭터의 0 터미네이터를 삭제한다. 'strcat'을 사용해 보셨습니까? – mch

+1

또한'server'가 무엇이고 버퍼'result'를 오버플로하는지 여부에 따라 다릅니다. –

+4

'현재 snprintf (결과는 sizeof 결과, "% S @ % s의", 메시지, 서버)'도'문자 메일 [150]'->'문자 서버 [150]' – BLUEPIXY

답변

4

result[strlen(result)]='@';strcpy(result,message);result 의해 도입 된 NUL 터미네이터 덮어. 따라서 후속 strlen의 결과는 정의되지 않습니다.

더 나은 솔루션 strncat을 사용하는 것입니다, 또는 당신은 전체 배열을 초기화합니다 char result[150] = {'\0'};

를 작성 멀리 얻을 수 있습니다.

그러나 여전히 result 어레이가 넘칠 위험이 있습니다. 당신은 그것을 제거하기 위해 더 안전한 strncpy을 사용할 수 있습니다. 더 나은 방법은 snprintf을 사용하고 C 표준 라이브러리에서 연결을 수행하도록하십시오.

+0

예, 확실히 사용' snprintf (결과, sizeof 결과, "% s @ % s", 메시지, 서버); 변수에 대한 더 나은 이름을 고려해보십시오. 프롬프트와 잘 일치하지 않습니다. – unwind