2013-02-27 1 views
0

이것은 구조체를 사용하는 숙제의 일부이며이 기능을 이해하지 못하는 것 같습니다. 함수는 string_t * concat (string_t * s1, string_t * s2)이고 새로운 문자열 struct를 반환합니다. 이것은 내가 지금까지 가지고있는 것이며 컴파일러에 도달 할 때마다 충돌합니다. 프로그램이 컴파일되지만 "file".exe가 작업을 중단 할 때 실행 중 오류가 발생합니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!C에서이 연결 함수에 어떤 문제가 있습니까?

typedef struct string{ //String struct (in .h file) 

char *line; 
int length; 

} string_t; 


string_t* concat(string_t *s1, string_t *s2) { //actual function (in .c) 

int len1, len2; 
len1 = length(s1); 
len2 = length(s2); 

int i, j, s; 

string_t *newStr; 
newStr = (string_t*)malloc(sizeof(string_t)*2); 


for (i = 0; i<len1; i++) { 
    *((newStr->line)+i) = *((s1->line)+i); 
    } 

for (j=0; j<len2; j++) { 
    *((newStr->line)+(i+j)) = *((s2->line)+j); 
    } 

*((newStr->line)+(i+j))='\0'; 

return newStr; 

} 



concat(s1, s2); //tests function 
+0

난 당신이 strncpy에서와 strcat와를 검색 좀 당신이 또한 string.length –

+0

에 대한이 size_t를 사용하는 것이 좋습니다 것? std 함수를 사용할 수 있습니까? –

+0

아니요, 제공된 기능을 사용할 수 없습니다. – apkim221

답변

4
newStr = (string_t*)malloc(sizeof(string_t)*2); 

당신은 newStr에 대한 메모리를 할당하지만 당신은 newStr->line 메모리를 할당하지 않습니다.

newStr = malloc(sizeof *newStr); 
newStr->line = malloc(s1->length + s2->length + 1); 

사이드 참고 : 같은 것을 시도 *((newStr->line)+i)newStr->line[i]과 같이 쓸 수있다.

+0

그래, 두 번째 부분에 대해 알고 있지만 우리 교수는 우리가 색인을 사용하는 것을 허용하지 않는다. 단지 포인터 산술 – apkim221

+1

@ user2041197 :(누가이 사람들에게 돈을 지불 하는가?) – cnicutar

+0

나는 당신이 말한 것을했으나 그것을 시험하려고 할 때 s3 = concat (s1, s2) 여기서 s3은 string_t *이고, 할당이 캐스팅없이 정수에서 포인터를 만든다고 말하는 오류가 발생합니다. – apkim221

0

BTW, 여기에 고양이에 대한 방법은 그 추한 PTR 수학 구문없이입니다 :

char* dest = newStr->line; 

const char* src = s1->line; 
while (*src) 
{ 
    *dest = *src; 
    ++dest; 
    ++src; 
} 

src = s2->line; 
while (*src) 
{ 
    *dest = *src; 
    ++dest; 
    ++src; 
} 

*dest = '\0'; 
+0

'while (* dest ++ = * srC++);의 문제점은 무엇입니까? – Sebivor

+0

@modifiablelvalue, C에서 포스트 증가 연산자가 좋지 않습니다. 임시가 만들어지기 때문입니다. 대부분의 경우 사전 승화 연산자를 거의 독점적으로 사용하는 것이 더 명확하고 명확합니다 (IMHO). 프로그래머가 한 줄에 넣을 수있는 모든 미친듯한 것들을 인간이 파싱하는 것을 좋아한다면, 아무 문제가 없습니다. –

+0

@modifiablelvalue, 그리고 나는 또한 그것이 작동한다는 것에 동의한다, 나는 단지 내가 쓰는 자신의 코드에서 그것을 사용하지 않을 것이다. –

관련 문제