2016-09-14 1 views
1

내 프로그램에 약간의 문제가 있습니다. 그것이 작동하는 방식은 하나의 함수가 두 개의 char 사이에 char의 문자열을 반환한다고 가정합니다. 예를 들어 "a1234a"와 "a"사이의 모든 문자를 반환하려면 1234를 얻습니다. 문제는 내 출력도 첫 번째 'a'를 인쇄하므로 대신 "a1234"를 얻습니다. 코드는 다음과 같습니다 :프로그램 오류 사이의 문자열

char* string_between(char *s, char c){ 
    int length = strlen(s); 
    int counter = 0; 
    char* strBetween = malloc(strlen(s)); 

    for(int i = 0; i<length; i++){ 
     if(s[i] == c){ 
     counter++; 
     } 
     if(counter == 1){ 
     strBetween[i] = s[i]; 
     } 
    } 
    if(counter<2){ 
     free(strBetween); 
     return NULL; 
    } 
    return strBetween; 
} 

은 내가 if(counter == 1) 성명에서 s[i] != c을 추가하는 시도했지만, 그것은 악화 전혀 아무것도 인쇄되지 않습니다. 나는 아직도 C에서 매우 익숙해 져 있으므로 가능한 한 간단하게 설명 해주십시오 :) 읽어 주셔서 감사합니다!

+3

디버거 사용 방법을 배우십시오. 디버거를 사용하면 코드별로 한 줄씩 단계별로 실행하여 변수 및 값을 모니터링하면서 코드가 무엇을하는지 확인할 수 있습니다. 모든 프로그래머가 필요로하는 필수 기술입니다. –

+1

하나의 기본적인 실수 : 반환 된 문자열을 종료하지 못했습니다. 또한 이름이'str'으로 시작하는 함수를 정의 할 수 없습니다. 이것은 예약 된 네임 스페이스입니다. – unwind

+0

'strBetween [i] = s [i];'줄에'i' 값이 무엇인지 생각해보십시오. 또한 'c'가 입력 문자열의 첫 번째 문자가 아닌 경우 어떻게 될까요? –

답변

4

이 구현에는 두 가지 문제점이 있습니다.

먼저, char* strBetween = malloc(strlen(s));은 입력 문자열의 길이와 동일한 길이의 문자열을 보유하기에 충분한 공간을 할당하려는 목적으로 널 종결 문자에 대한 메모리를 할당하지 않습니다. 둘째, for 루프를 통해 추론하면 실제로 입력 된 문자열에서 발견 된 인덱스에서 할당 한 문자열에 문자 c과 관심있는 문자열 (예 : "a1234")을 복사하는 것이 실제로 무엇인지 알 수 있습니다. .

"a1234a"가 입력 문자열 인 경우 "a1234_"(최종 문자가 정의되지 않음)를 통해 복사됩니다. 그러나 입력 문자열이 "ggga1234aggg"라고 가정합니다. 출력은 "_"문자가 정의되지 않은 "___a1234____"문자열입니다. if 조건에서 s[i] != c을 추가하는 이유가 작동하지 않는 이유는 문자열의 시작 부분에 정의되지 않은 문자를 아직 지정하지 않았기 때문입니다. 이 경우에도 여전히 "_1234-"로 끝납니다 (기울임 꼴을 방지하려면 _ 대신-를 사용). 대개 정의되지 않은 문자는 0 (즉, null 종결 자)이되며,이 경우 본질적으로 길이가 0 인 문자열이므로 결과를 설명 할 수 있습니다. 물론 당신은 정의되지 않은 행동에 의존해서는 안됩니다.

1

컴퓨터를 가장하고 루프의 본체를 실행하는 경우 대상 캐릭터에 있다고 가정하면 왜 이런 일이 일어나는지 분명해야합니다. c을 확인하고 카운터를 늘린 다음 동일한 반복에서 카운터가 1인지 확인하십시오. 분명히 c의 첫 번째 인스턴스를 복사 할 것입니다.

비교 순서를 바꾸거나 두 번째 비교에 else if을 사용하십시오.

또한 반환 된 문자열을 올바르게 종료하는 코드를 추가하십시오.

관련 문제