2015-01-06 3 views
0

Я пытаюсь преобразовать C-String ко всему нижнему регистру без использования tolower из ctype.h. Hower мой код не работает: я получаю ошибку времени выполнения. То, что я пытаюсь сделать, - это изменить значение ASCII заглавных букв bij 'a' - 'A', которое, насколько мне известно, должно преобразовать эти значения в те, что были в нижнем регистре.Преобразование C-String во все нижние

#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

Две ошибки.

Этот код не будет преобразовывать A и Z в нижний регистр:

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

Использование> = и < = вместо.

И нецелесообразно пытаться изменить строковый литерал! Массивы могут быть изменены, строковые литералы не могут.

Изменить что char * s = "ThiS Is AN eXaMpLe"; к char s[] = "ThiS Is AN eXaMpLe";

+0

Содержимое массива может быть изменено. –

+1

Я думаю о массиве как о своем содержании, и ничего больше. Он неявно конвертируется в указатель, но на самом деле это не то же самое, что указатель const. Но я полагаю, что это правильный способ увидеть это. – tux3

+0

@MooingDuck В некоторых случаях строковый литерал будет находиться в памяти программ только для чтения. Попытка изменить его в этом случае приведет к сбою программы. Я столкнулся с этой проблемой при программировании микроконтроллеров AVR. – SimpleJ

0

Две проблемы, которые я могу видеть сразу: (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

Первая строка вопроса явно говорит о том, что она пытается сделать это «без использования tolower from ctype.h». – tux3

+0

@ tux3 Спасибо. Я переписал свое предложение. Суть заключалась в разделении функций, а не на повторном использовании библиотеки, но имитация ее. –