2016-12-28 8 views
0

저는 C에서 포인터와 문자열로 뛰어 들고 있습니다. 아직 개념에 익숙해 져 있습니다. 나는 strchr() 함수의 버전을 구현하려고했는데 - 연구 목적을 위해 string.h와 동일하지만 기본적인 것은 여전히 ​​올바르지 않습니다. 이 세그먼트 오류를 ​​반환 왜 알아 내려고 노력하고있어누군가가이 strchr() C 세그먼트 오류를 ​​이해하는 데 도움이 될까요?

#include <stdio.h> 

char* my_strchr(const char* str, int c){ 
    if (str == NULL){ 
    printf("STR is NULL. Finishing the program\n"); 
    return NULL; 
    } 
    while (*str != '\0'){ 
    if (*str == c){ 
     return (char*) str; 
    } 
    str++; 
    } 
    return NULL; 
} 

int main(){ 
    char *a = "Hello World!"; 
    char *b; 
    char c; 

    printf("Type the character you want to find in the Hello World! string:\n"); 
    scanf(" %c", &c); 

    b = my_strchr(a, c); 

    printf("Character found! %c\n", *b); 

    return 0; 
} 

:

여기 내 코드입니다. gbd를 사용하면 오류가 마지막으로 printf에 있으며 이는 *b을 인쇄하려고 시도합니다.

을 반환하면 char 포인터 변수에이 반환 값을 저장해야합니다. 맞습니까?

+3

이 문제는 모든 입력 또는 테스트 문자열에 표시되지 않는 문자에서만 발생합니까? – usr2564301

+0

모든 입력이있는 @Rad Lexus ... 아직 무슨 일이 일어나고 있는지 파악하려고 시도 중입니다 ... – ulissesBR

+2

입력 사항을 표시하십시오. 또한 'strchr'은 '\ 0'을 검색 할 수 있습니다. – BLUEPIXY

답변

5

my_strchr 문자열에서 문자를 찾지 못하면 NULL을 반환합니다.

이 경우 bNULL이므로 *b은 segfault를 설명하는 정의되지 않은 동작입니다. tuple_cat 말한 것처럼

당신은 :, *b을 인쇄하기 전에 예컨대을 my_strchr의 결과를 확인 할 수 있습니다

if (b != NULL) { 
    printf("Character found! %c\n", *b); 
} else { 
    printf("Not found...\n"); 
} 
+0

답장을 보내 주셔서 감사합니다. 문제가되었습니다. 나는 b가 NULL이고 이제는 매력처럼 작동하는지 테스트하기 위해 if 문을 추가하여 해결했습니다! 모두에게 감사드립니다! – ulissesBR

0

어떤 논리 문제가 있습니다.

그러나 나는 또한 당신이 어떤 개념을 이해하지 못한다고 생각합니다. 당신의 코드는 제 관점에서 깨끗하지 않습니다.

난 당신이 너무 코딩 :

먼저 당신이 당신의 기능에 숯불 *를 반환 유지 C로 코딩을 시작 생각하지만 당신은 당신이 할 수있는 표준 C에서

char* my_strchr(const char* str, int c) 

로 함수의 인수를 정의 당신이 그것을 수정할 수없는 상수를 터치하면 상수를 선언 할 수 있습니다.

그래서 문자열에서 문자를 반환하는 그런

char* my_strchr(char* str, int c) 

올바른 방법으로 기능을 변경하는 것은

return (char*)str; 

만의 끝에 단지

return str; 

없는 당신의 기능.

이렇게하면 char * (문자열)에있는 첫 번째 char의 주소를 보내 게됩니다. char *에서는 변수 이름 만 지정하면됩니다.

나는 당신이 읽을 것을 권장합니다 : https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html

RTFM을! 1.3.4의 char * 부분 문자열 상수

어쨌든 좋은 행운을 빕니다.

+1

고마워요 @ 라파엘, 나는 그것을 파헤쳐 볼 것입니다. 어쨌든, 내가 따르던 참조는 문자열을 인수로 전달할 때 함수 인수는 문자열의 수정을 피하기 위해 상수 여야 함을 알립니다. – ulissesBR

+0

당신이 그것을 수정하지 않는다면 맞아. 하지만 char *를 반환하는 것이 무엇이겠습니까? 만약 당신이 아무것도하지 않으면, 그냥 ok를 누른 다음 반환하는 것을 체크 할 수 있습니다. void 또는 그렇지 않으면 컴파일러 경고를 피하는 것이 좋습니다. –

+3

이것은'const'-correctness에 관한 나쁜 조언 일뿐입니다. 'strchr (const char * string, int c)'표준 라이브러리 버전의 함수 프로토 타입을 읽어야한다. 이 경우'const'는'string '이 가리키는 위치에 저장된 값을 수정할 수 없음을 나타냅니다. 포인터 자체의 값은 (예를 들어, 문자열을 반복하여) 수정할 수 있습니다. 라이브러리 함수를 에뮬레이션 할 때 표준 프로토 타입을 사용하고 왜 그런 식으로 작성되었는지 이해하려고 시도하는 것이 가장 좋습니다. OP가 이것을했습니다. –