2013-01-10 3 views
2

나는 C 초보자입니다. 포인터를 사용하여 strcat 함수를 만들고 싶었습니다. 나는 그것을 만들었지 만 무엇이 잘못되었는지를 모릅니다. gcc 컴파일러를 사용하여 세그먼트 오류 출력을 제공했습니다.포인터를 사용하여 C 프로그래밍 strcat

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

char scat(char *,char *); 

void main() 
{ 
    char *s="james"; 
    char *t="bond"; 

    char *q=scat(s,t); 
    while(*q!='\0') printf("the concatenated string is %c",*q); 
} 

char *scat(char *s,char *t) 
{ 
    char *p=s; 
    while(*p!='\0'){ 
     p++; 
    } 
    while(*t!='\0'){ 
     *p=*t; 
     p++; 
     t++; 
    } 
    return p-s-t; 
} 
+1

주 함수는 void 대신 int를 반환해야합니다. 컴파일러가 경고를 내도록 구성되어 있는지 확인하십시오. – hugomg

답변

5

이 하나가 작동 : 그냥 다음 s의 끝으로 포인터를 이동하고 있기 때문에

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

char *scat(char *,char *);     /* 1: your prototype was wrong */ 

void main() 
{ 
    char *s="james"; 
    char *t="bond"; 

    char *q=scat(s,t); 
    printf("cat: %s\n", q);    /* 2: you can use %s to print a string */ 
    free(q); 
} 

char *scat(char *s,char *t) 
{ 
    char *p=malloc(strlen(s)+strlen(t)+1); /* 3: you will have to reserve memory to hold the copy. */ 
    int ptr =0, temp = 0;     /* 4 initialise some helpers */ 

    while(s[temp]!='\0'){     /* 5. use the temp to "walk" over string 1 */ 
     p[ptr++] = s[temp++]; 
    } 
    temp=0; 
    while(t[temp]!='\0'){     /* and string two */ 
     p[ptr++]=t[temp++]; 
    } 
    return p; 
} 
+0

의견에 실수를 지적함으로써 당신의 설명 방식이 훌륭했습니다. 고마워 친구 !!!!!! –

0

의 포인트는 "제임스는 \ 0", & 리터럴 문자열이 일정하게 수정할 수 없습니다하기 때문입니다.

변경 char *s="james";에서 char s[50]="james";으로 변경하십시오.

2

p가 문자열의 끝까지오고 잘못된 메모리로 넘어 가기 시작하기 때문에. 그런 이유로 세분화 오류가 발생합니다.

+0

불법으로 전진한다는 것은 무엇을 의미합니까? 포인터 p가 문자열 끝까지 증가하므로 p-s-t가 문자열의 첫 번째 주소에 도달 한 다음 간접 연산자 *를 사용하여 문자를 가져옵니다. 미리 감사드립니다. –

+0

char * scat (char * s, char * t) { char * p = s; while (* p! = '\ 0') {// 여기서 "string"의 끝에 도달했음을 의미합니다. p ++; // 포인터를 앞으로 나아가고 있습니다 while (* t! = '\ 0') { * p = * t; p ++; // 여기서 문자열의 끝을 앞 당깁니다. t ++; } return p-s-t; } – hmatar

2

s 끝에 복사 할 공간을 새로 할당해야합니다. 그렇지 않으면, 당신의 loo [당신은에 액세스 할 수없는 메모리에 갈 것입니다.

당신은 약 malloc()here에 대해 자세히 알아보십시오.

3

는 리터럴 문자열과 s을 수정하는 정의되지 않은 동작이며, 결국 p, 문자열 리터럴 가리키는 :

char* s = "james"; 

s가있는 지역 char* p이 할당 scat()에 첫 번째 인수로 전달된다 다음 : 첫 번째 호출에 널 문자 씩 "james" 리터럴 문자열의 끝을 파일 덮어 쓰기를 시도

*p=*t; 

.

char* result = malloc(strlen(s) + strlen(p) + 1); /* + 1 for null terminator. */ 

를하고 그것으로 복사

가능한 솔루션은 두 개의 입력 문자열는 연결은을 포함하기에 충분히 큰 버퍼를 할당 malloc()을 사용하는 것이다. 발신자는 char*free()을 기억해야합니다.

frequently asked pointer questions 목록이 유용 할 것입니다.

0

포인터의 기본 사항을 이해해야합니다.

char *는 문자열 또는 문자 배열이 아니며 데이터 시작 부분의 주소입니다.

char * - char *를 사용할 수 없습니다!

This is a good tutorial to start with

당신은 의 malloc을 사용해야합니다

+0

하지만 두 번째 줄에서는 데이터 시작 부분의 주소를 가리키며 주소는 정수 여야합니다. 그렇다면 왜 int에서 int를 subtrat 할 수 없습니까? –

+0

당신은 할 수 있고 그것은 당신에게 새로운 주소를 줄 것입니다. 그러나 그것은 쓸모가 없습니다. –

0

당신은 세그먼트 오류를 ​​얻을 수 s 다음의 메모리에 p의 데이터 쓰기를 시작하십시오. s 이후에 쓰기 가능한 메모리가 있다고 생각하는 이유는 무엇입니까?쓸 수없는 메모리에 데이터를 쓰려고하면 세그먼트 화 오류가 발생하고 s 다음의 메모리는 쓸 수 없게됩니다 ("문자열 상수"는 일반적으로 읽기 전용 메모리에 저장되기 때문에 예상됩니다).

0

여러 가지가 잘못되어 있습니다.

먼저 함수 내에서 생성 된 포인터를 반환하려면 malloc으로 처리해야합니다. 대상을 함수의 인수로 전달하면 훨씬 쉽습니다. 이전 접근 방식을 따르는 경우, 완료 할 때 free()을 잊어 버리지 마십시오.

또한 scat 함수는 선언에 char *scat이 아닌 char scat이 아닌 포인터를 반환해야합니다.

마지막으로 문자열을 인쇄하는 데 루프가 필요하지 않으며 printf("%s", string);이 문자열을 인쇄 할 때 처리됩니다 (종료 된 경우).

0

처음에는 코드가 아래 줄 때문에 infinte 루프가됩니다. 당신은 "p ++; t ++"문장을 포함하여 큐어 브레이스를 사용하기로되어있었습니다.

while(*t!='\0') 
*p=*t; 

이 경우에도 문자열 리터럴의 내용을 변경하려고합니다. 세그먼트 화 오류와 같은 정의되지 않은 동작이 발생합니다.

큰 따옴표로 묶인 문자 시퀀스를 문자열 리터럴이라고합니다. "문자열"이라고도합니다. 문자열의 크기는 고정되어 있습니다. 만든 후에는 크기를 늘리거나 내용을 변경할 수 없습니다. 그렇게하면 정의되지 않은 동작이 발생할 수 있습니다.

이 문제를 해결하려면 전달 된 두 문자열 길이의 합인 크기의 새 문자 배열을 할당해야합니다. 그런 다음 두 개의 문자열을 새 배열에 추가하십시오. 마지막으로 새 배열의 주소를 반환합니다.

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

char* scat(char *,char *); 
void append(char *t , char *s); 

int main(void) 
{ 
    char *s="james"; 
    char *t="bond"; 

    char *n = scat(s,t);   
    printf("the concatenated string is %s",n); 

    return 0; 
} 

char* scat(char *s,char *t) 
{ 
    int len = strlen(s) + strlen(t); 
    char *tmp = (char *)malloc(sizeof(char)* len); 

    append(tmp,s); 
    append(tmp,t); 

    return tmp; 
} 


void append(char *t , char *s) 
{ 
    //move pointer t to end of the string it points. 
    while(*t != '\0'){ 
     t++; 
    } 

    while(*s != '\0'){ 
     *t = *s; 
     t++; 
     s++;  
    }  
} 
관련 문제