2016-11-17 2 views
-3

Я ищу способ конвертировать только буквы верхнего регистра в строчные буквы из введенной пользователем строки. Проблема в том, что мое условие игнорируется, и каждый символ изменяется, а не только верхний регистр. Для записи я также попытался преобразовать символы в int с использованием atoi, но столкнулся с той же проблемой, что и выше.Использование некоторых символов в строке в C

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

int main() 
{ 
    char letter[100]; 
    scanf("%s", letter); 
    int i; 
    for(i=0; letter[i]!='\0'; i++){ 
     if((letter[i]>='A')||(letter[i]<='Z')){ 
      letter[i]=letter[i]+32; 
     } 
    } 
    printf("%s", letter); 
    return 0; 
} 
+4

|| должно быть &&. Голосование закрывается как простая опечатка. – Lundin

ответ

3

Вы проблема заключается в том, что вы говорите,

if((letter[i]>='A')||(letter[i]<='Z')){ 
    letter[i]=letter[i]+32; 
} 

вместо

if((letter[i]>='A')&&(letter[i]<='Z')){ 
    letter[i]=letter[i]+32; 
} 
+4

Это необоснованное предположение о наборе символов ASCII, который не поддерживается [Стандартом C] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf). Он не переносится. Per ** 5.2.1 Наборы символов **, * только * цифры '' 0''-''9'' гарантированно будут представлены последовательно. –

+0

Это правда, хотя кажется, что OP хочет сделать это именно так. :) – user3794667384

+1

@AndrewHenle На практике это работает на всех платформах. – Stargateur

6

Я предлагаю использовать функции библиотеки, как islower(), isupper(), toupper() и tolower() для этого. В вашем случае, вы могли бы сделать это следующим образом:

for(i = 0; i < strlen(letter); i++) 
{ 
    letter[i] = tolower(letter[i]); 
} 
+1

Добро пожаловать в переполнение стека! Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, [править], чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы подумайте о том, чтобы вместо этого писать это как комментарий. –

+0

Спасибо за ваше предложение, я добавил пример к моему ответу. –

4

Вы можете использовать функцию tolower() вместо:

#include <ctype.h> 
for(i = 0; i < strlen(letter); i++){ 
    letter[i] = tolower(letter[i]); 
} 

tolower() функция преобразует заглавные буквы в строчные буквы. Обратите внимание, что для его использования вы должны включить ctype.h.

В противном случае проблема с вашим кодом в том, что вы используете || вместо &&. Вы тестируете, если письмо меньше 'Z' или больше, чем 'A', что всегда верно. То, что вы хотели сделать, это проверить, если оно находится между 'Z' и 'A', что означает, что вы должны проверить, если оно меньше 'Z' И больше, чем 'A'.

Смежные вопросы