2013-02-19 7 views
0

내 자신의 문자열 함수를 만들려고하는데이 시점에서 멈추는 것 같습니다. 아래는 내가 지금까지 문자열을 만들어 그것을 출력하고 크기를 반환하는 것입니다. 하지만 char뿐만 아니라 문자열 문자열 포인터를 전달하는 함수를 만들어야합니다 및 해당 문자열의 해당 char 발생 횟수를 반환합니다. 이 함수에서 make_string 함수를 호출하려고하지만 작동하도록 만들 수 없습니다. .h 파일에는 미리 나열된 기능 만 있습니다. 이것에 대한 도움을 주시면 감사하겠습니다. 감사!C에서 자체 문자열 함수를 만드는 방법은 무엇입니까?

#include "readLineUtilities.h" 

int make_string(char **line) 
{ 
char *a,b; 
int i,size=0; 
a = (char *) malloc(sizeof(char)); 
b = getchar(); 
while(b != '\n' && size < MAX) 
{  
    *(a+size) = b; //remember at this point size = 0 
    size++; 
    b = getchar(); 
    a = realloc(a,size+1); 
} 
*(a+size) = '\0'; //end of string marker so no need to return the size directly 
*line = a; 
return size;  

} 

int char_in_string (char *line, char c) { 

make_string(*line); 

} 

void print_string(char *line, int size){ 
char *a; 
int i; 
a = line; 
for (i=0;i<size;i++) 
    printf("%c",*(a+i)); //no end of line 
printf("\n"); 
} 


int length_string(char *line){ 
int size = 0; 
char *c,b; 
c = line; 
if (c == NULL){ 
    printf("line is null\n"); 
    return size; 
} 
while (*(c + size) != '\0'){ 
    size++; 
} 
return size; 
} 
+0

* 왜 * 당신이 이것을하려고하는지 설명 할 수 있습니까? 'printf()'와'getchar()'을 사용하기 때문에 내장 문자열 함수를 사용하는 것을 피할 수는 없습니다. 그리고'make_string()'에서'realloc()'호출의 수는 우스꽝 스럽기 때문에 성능을 낼 수는 없습니다. 그래서 너는 무엇을하려고하는거야? –

답변

1

이 코드에서 제시된 오류 컬렉션을 보면이 코드를 사용하는 프로그램이 예상대로 작동하지 않는 이유를 쉽게 설명 할 수 있습니다.

a = (char *) malloc(sizeof(char)); // sizeof (char)는 항상 1이므로 형식 (sizeof)은 몇 개의 문자 유형을 나타 내기 때문에 1입니다. malloc은 어떤 타입을 반환합니까? void *char *으로 변환 할 필요가 없습니다. 왜냐하면 그 변환이 C : a = malloc(1);에 의해 암묵적으로 제공되기 때문입니다. 캐스트 할 때 오류가 발생하면, malloc/realloc이 작동하는 데 필요한 #include <stdlib.h>이 누락됩니다.

b = getchar(); // getchar 반환 유형은 무엇입니까? b의 유형은 무엇입니까? 이러한 유형은 동일해야하지만 귀하의 예에서는 그렇지 않습니다. getchar는 성공시 부호없는 char 값이 될 int를 반환합니다. 실패하면 getchar은 음수 값을 반환합니다.이 값은 가능한 모든 성공 값과 구분됩니다. getchar()의 반환 값을 int에 저장하고 계속하기 전에 그것이 양수인지 확인하는 것이 좋습니다. 그렇지 않으면 getchar()이 '\ n'값과 다른 오류를 반환 할 때 프로그램이 멈추고 리소스가 느려질 수 있습니다.

a = realloc(a,size+1); // realloc이 NULL을 반환하면 어떻게됩니까? 프로그램이 이전 할당을 유출합니다. 반환 값을 char *temp으로 지정하고 덮어 쓰기 전에 성공 여부를 확인하는 것이 좋습니다. 이 문제를 해결하지 않으면 프로그램이 때때로 중단 될 수 있습니다.

int char_in_string (char *line, char c) { make_string(*line); } // return 성명은 어디에 있습니까? make_string은 char **이지만, *line이라는 표현식은 char으로 평가됩니다. 선의 유형은 무엇입니까? & 라인은 어떨까요? 이것은 사용될 때 확실히 segfault를 일으킬 것입니다.

문자열이 끝나는 위치를 결정하기 위해 make_string의 문자열 끝에 '\ 0'을 삽입한다고 가정합니다. print_string 구현의 '\ 0'에서 멈추는 것이 좋습니다. 초기화되지 않은 값을 사용하려고하면 정의되지 않은 동작이 호출되고 프로그램이 중단 될 수 있습니다.

1

다음과 같은 것이 작동합니다.

관련 문제