2016-11-05 24 views
0

tolower 함수에 문제가 있습니다. argv와 함께 사용하려고했지만 출력은 $ 0 @입니다. 내 코드에 무슨 문제가 있습니까?tolower 함수에서 잘못된 출력

#include <stdlib.h> 
#include <stdio.h> 

void makeLower(char *s) { 
    int i; 
    for(i = 0; s[i] != '\0'; i++){ 
     s[i] = tolower(s[i]); 
     } 
     printf("%s", s); 
} 

int main(int argc, char *argv[]) { 
    argv[0]="A"; 

    makeLower(argv); 
    return 0; 
} 
+2

문자열 리터럴에 안정적으로 쓸 수 없습니다. 그렇게하면 정의되지 않은 동작이 호출됩니다. 'main()'을'int main (void) {char str [] = "A"로 변경하십시오. makeLower (str); 0을 반환; }'예를 들어. 'printf()'에 개행을 추가해야합니다; 아마 (더 이상 범용적인) 유틸리티 함수가 아닌'main()'함수에서 인쇄해야합니다. 엄밀히 말하면,'unsigned char' 나 EOF를 tolower() (일반적으로'tolower (unsigned char) s [i])'로 구현 한'int'를 전달해야합니다). 그러나 'A'는 문제가되지 않습니다. –

+1

아마도 여러분은 이미 argv [0]'에 무언가를 할당하려한다는 오해가 있습니다. 이것들은 여러분의 환경에 대한 정보를 담고있다. 특히 argv [0]는 컴파일 된 프로그램의 이름이어야한다. ''A "에 할당하지 않고 그냥 실행하면''모두 좋다. 그러면 argv가 가리키는 문자열은 수정 가능하다. –

답변

0

argvchar**이다 포인터에 대한 포인터이다. 그러나이 함수는 char*을 사용합니다. 그래서, 당신은 같은 전달해야

makeLower(argv[0]); 

하지만이 argv[0] 지금 리터럴 문자열을 가리키는 때문에 작동하지 않을. 문자열 리터럴 수정은 undefined입니다.

대신 같은 수정 배열을 전달 :

int main(int argc, char *argv[]) { 
    char arr[] = "A"; 

    makeLower(arr); 
    return 0; 
} 

다른 옵션은 (argv[0]를 통해) 전달 된 문자열 리터럴의 복사본을 만들하고 당신이 그것을 수정할 수있을 것입니다. 기본적으로 C에서 합법적으로 문자열 리터럴을 수정할 수 없다는 아이디어가 있습니다.