2015-01-06 13 views
0

ctype.h에서 tolower를 사용하지 않고 C 문자열을 모두 소문자로 변환하려고합니다. 코드가 작동하지 않는 것 같습니다. 런타임 오류가 발생합니다. 내가 뭘하려는 건 대문자로 된 글자 bij 'a'의 ASCII 값을 바꾸는 것이다. 'A'는 저 값을 소문자로 변환해야한다.C-String을 모두 lower로 변환

#include <stdio.h> 
void to_lower(char* k) { 
    char * temp = k; 
    while(*temp != 0) { 
     if(*temp > 'A' && *temp < 'Z') { 
      *temp += ('a' - 'A'); 
     } 
     temp++; 
    } 
} 

int main() { 
    char * s = "ThiS Is AN eXaMpLe"; 
    to_lower(s); 
    printf("%s",s); 
} 
+1

받는 오류는 무엇인가요? 'to_lower '다음에 여분의'}'이있는 것 같습니다. – SimpleJ

+1

또한 정의되지 않은 동작 인 문자열 리터럴을 수정하는 것처럼 보입니다. –

+0

@SimpleJ : 그는 여분의'}'을 가지고 있지 않습니다. 단지 포맷되지 않은 코드 일뿐입니다. –

답변

9

두 가지 오류가 있습니다.

이 코드는 변환하지 않습니다 Z는 소문자로 :

if(*temp > 'A' && *temp < 'Z') { 

사용> = 및 < = 대신.

그리고 문자열 리터럴을 수정하는 것은 합법적이지 않습니다! 배열은 수정할 수 있지만 문자열 리터럴은 수정할 수 없습니다.

변경이 char * s = "ThiS Is AN eXaMpLe"; 내가 바로 볼 수있는 문제

+0

배열의 내용을 수정할 수 있습니다. –

+1

나는 배열을 내용으로 생각하고 그 이상은 없다. 암시 적으로 포인터로 변환 가능하지만 실제로는 const 포인터와 같은 것은 아닙니다. 그러나 나는 그것을 볼 수있는 유효한 방법이라고 생각합니다. – tux3

+0

@MooingDuck 경우에 따라 문자열 리터럴은 읽기 전용 프로그램 메모리에 있습니다. 이 경우 프로그램을 수정하려고하면 프로그램이 중단됩니다. AVR 마이크로 컨트롤러를 프로그래밍하는 동안이 문제에 부딪 혔습니다 – SimpleJ

0

char s[] = "ThiS Is AN eXaMpLe";에 (1) char *s = "This..."가 아닌 쓰기 가능 문자열을 만듭니다. 문자 배열을 사용하고 문자열을 복사해야합니다. (2) if (*temp > 'A' && *temp < 'Z')는 A와 Z를 건너 뜁니다. >=<=이 필요합니다.

1

기존 표준 라이브러리 기능을 사용하지 않더라도 인터페이스를 따라 가면 유용 할 수 있습니다. tolower은 개별 문자를 변환합니다. 이 함수를 문자열에 적용하는 것은 분리 된 함수로 작성할 수 있습니다.

#include <stdio.h> 
#include <string.h> 

int to_lower (int c) { 
    if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c)) 
     c = c - 'A' + 'a'; 
    return c;   
} 

void mapstring (char *str, int (*f)(int)) { 
    for (; *str; str++) 
     *str = f(*str); 
} 

int main() { 
    char s[] = "THIS IS MY STRING"; 

    mapstring(s, to_lower); 
    printf("%s\n", s); 
    return 0; 
} 
+0

질문의 첫 번째 줄은 명백히 "ctype.h에서 tolower를 사용하지 않고"하려고하는 것입니다. – tux3

+0

@ tux3 감사합니다. 나는 내 제안을 다시 썼다. 요점은 라이브러리를 재사용하는 것이 아니라 모방하는 기능을 분리하는 것이 었습니다. –