2012-07-15 2 views
1

다음 코드는 첫 번째 문자열 만 연결하고 두 번째 문자열은 무시합니다. 수집 한 것부터 Null 종료 문자열과 관련이 있습니다. 내가 C를 처음 접했을 때, 이것은 나에게 새로운 개념이다. 누군가 아래 코드를 작동시키는 데 도움을 줄 수 있습니까? 그것은 저에게 이것을 이해하는데 많은 도움이 될 것입니다.C : String Concatentation : Null Terminated Strings

void concatTest(); 

int main() 
{ 
    concatTest(); 

    system("PAUSE"); 
    return 0; 
} 

void concatTest() 
{ 
    char string1[20], string2[20], string3[40]; 
    char *ptr1, *ptr2, *ptr3; 
    ptr1 = &string1[0]; 
    ptr2 = &string2[0]; 
    ptr3 = &string3[0]; 
    int i; 

    printf("You need to enter 2 strings.. each of which is no more than 20 chars in length: \n"); 

    printf("Enter string #1: \n"); 
    scanf("%s", string1); 

    printf("Enter string #2: \n"); 
    scanf("%s", string2); 

    int len1 = strlen(string1); 
    int len2 = strlen(string2); 

    for (i = 0; i < len1; i++) 
    { 
     ptr3[i] = ptr1[i]; 
    } 
    for (i = len1; i < len1 + len2; i++) 
    { 
     ptr3[i] = ptr2[i]; 
    } 

    printf("%s\n", string3); 
} 

답변

2

len1에서 len1 + len2까지 범위의 i을 사용하여 ptr2[i]의 색인을 생성하고 있습니다. 이 값은 아마도 string2 배열의 범위를 벗어날 것입니다 (입력 한 첫 번째 문자열이 비어 있지 않은 경우). 다음과 같이

나는 두 번째 루프를 작성할 수 있습니다

for (i = 0; i < len2; i++) { 
    ptr3[len1 + i] = ptr2[i]; 
} 
+0

우수. 고마워. 그렉. 나는 StackOverflow가 나를 (약 7 분 정도) 내게 허락하자마자 당신의 대답을 받아 들일 것이다 .. – Matt

+0

원래 코드처럼 ptr3의 포인트에서 인덱스 시작을 좋아했다. 올바른 위치에서 복사해야합니다. – Hogan

2

내 대답에는 코드가 없지만 유용한 설명이 포함됩니다.

C의 각 문자열은 \0으로 끝납니다. 두 문자열을 연결하려면

당신은 당신이 2 문자열의 문자로 첫 번째 문자열합니다 (\0)의 마지막 문자을 덮어 확인해야합니다. 그렇지 않으면, 문자열 함수에 의해 \0이 발생하자마자 "연결"문자열의 길이에 관계없이 문자열 끝에 도달했다고 가정합니다.

물론 접합 문자열에 충분한 공간이 있는지 확인해야합니다.

+0

감사합니다. 하지만, 내가 필요한 것은 코드 예제입니다. 실제로 어떻게 할 것인가? 내가 대답을 얻을 때 나는 아마 나 자신을 걷어 찰 것이다. 그러나 지금 나는 단지 그것을 볼 수 없다. – Matt

+1

다시 한번 감사드립니다. 내가 찾던 답변이 아니지만 어쨌든 투표를받습니다 .-) – Matt

1

당신은 PTR2의 첫 번째 문자에서 시작해야합니다. 내가 수집 한 것과

ptr3[i] = ptr2[i-len1]; 

, 그것은 종료 문자열 널 함께 할 수있는 뭔가가.

예. 문자열은 오프셋 0에서 시작합니다. 주먹 문자열의 길이에 따라 임의의 지점에서 시작했습니다.