2017-02-21 26 views
-6

문자열을 모두 소문자로 변경하는이 함수가 있습니다.포인터를 사용하여 함수 (tolower)에 대한 단위 테스트

이 함수에 대한 단위 테스트를 만들려고하는데 잘못된 인수를 전달하는 것으로 생각되며이 오류가 발생합니다.

Segmentation Fault (core dumped) 

이것은 내 코드입니다.

void example (char const * str1, int length, char * str2) { 
    int i; 
    for(i = 0; i < length; i++) { 
     *(str2 + i) = putchar(tolower(*(str1 + i))); 
    } 
} 

void testexample() { 
    char * str1 = "TEST"; 
    char * str2 = ""; 
    example(str1, 4, str2); 
    printf("%s\n", *str2); 
} 

int main() { 
    testexample(); 
    return 0; 
} 

STR1 원래의 스트링이고, n 스트링의 길이, 및 STR2는 STR1의 모든 하부 케이스 버전이다.

저는 지금 당분간이 문제를 해결하려고 노력하고 있습니다.

감사합니다. 고맙습니다. 메인에서

+2

어떻게 컴파일 되었습니까? – EOF

+0

'str2'는 문자열 리터럴을 가리키며, 읽기 전용 일 가능성이 높습니다. 그리고 어쨌든'str1'을 복사 할만큼 길지 않습니다. – Dmitri

+1

C11 초안 표준 n1570 : * 6.5.16 대입 연산자 구속 조건 대입 연산자는 왼쪽 피연산자로 수정 가능 값을 가져야합니다. *, * 6.3.2.1 Lvalues, arrays 및 함수 지정자 [...] 수정 가능한 lvalue 에는 배열 유형이없고 불완전 유형이없고 const한정 유형 [...] *이없는 lvalue입니다. 귀하의 컴파일러는 진단 메시지를 발행 할 의무가 있습니다. – EOF

답변

-1

줄마다 코드를 살펴 보겠습니다. 당신이 표시하는 일을하려고 할

*(str2 + i) = putchar(tolower(*(str1 + i))); 

소문자와 stdout에 그러나 putchar 디스플레이, str2에 문자를 결과를 저장하는 str1을 변환 할 수 있습니다. 당신이 단지 값을 직접 설정하고 싶은, 그래서 우리는 이것에 라인 변경 :

*(str2 + i) = tolower(*(str1 + i)); 

다음으로, 우리는 (당신이 무슨 일을하는지에 대한 문법 설탕입니다) 인덱스 연산자 a[b]을 사용할 수에 포인터의 요소를 더 깔끔하게 접근 해 봅시다.

str2[i] = tolower(str1[i]); 

이제는 testexample() 기능을 살펴 보겠습니다.

char *str2 = ""; 

은이 프로그램의 텍스트 섹션에있을 것입니다 리터럴 빈 문자열에 대한 포인터 str2 포인트. 아마도 읽기 전용 일 것입니다. (편집 : 쓰기를 시도하면 Bad Thing ™이 발생합니다.) 여기에있는 데이터의 크기는 NULL 종결 자의 경우 1 바이트입니다. 함수의 결과를 여기에 출력하려면 str1과 같은 크기의 쓰기 가능한 메모리 블록이 필요합니다.

char *str2 = malloc(strlen(str1) + 1); 
str2[strlen(str1)] = 0; // Null terminate the string 

완료되었습니다. (참고 : 나중에 str2를 비울 수 있습니다).

+1

...'putchar()'은 출력 한 문자 (unsigned'char' 캐스팅으로'int')를 반환하기 때문에'putchar()'이 발생하지 않는 한 계속 작동합니다 오류. – Dmitri

+0

'malloc()'에 대한 필요성이 없기 때문에, OP는 문자열이 현명하게 이해되지도 않습니다. OP가 왜'strlen (str1) + 1'이'+ 1'을 가지고 있고, 문자열 리터럴은 표준이 그렇게 말하기 때문에 읽기 전용이라고 생각합니다. 그래서 "* 아마 *"가 아닙니다. –

+0

@IharobAlAsimi 확인해야 할 것이지만, 표준에서는 단지 읽기 전용 일 수도 있다고 생각합니다 ... – Dmitri

0

:

char * str2 = ""; 

그리고 당신은 매개 변수로 str2을 통과,하지만 너무 작은 저장 공간을 가지고 있으며, 그 기억은 더욱 읽기 전용 메모리 (리터럴로 점). 결과는 충돌입니다. 사용 :

char str2[32] = 0; 

또는 null 종단 문자를 포함하여 필요한 모든 길이.

+1

'char c; c = 'a';'문자 할당에 아무런 문제가 없습니다. – EOF

+0

당신도 이해하기 시작하지 않았습니다. – EOF

+0

@ EOF, ... 어 .. 나는 포인터 충돌 모드에 있었기 때문에 (결과적으로 :-)). –

0

printf("%s", *str2)으로 작성하십시오. str2가 문자열이면 * str2는 char입니다.