Как установить в строке строчные буквы

У меня есть char foo[SIZE]; //(string)

и правильно ввели его, используя %s (как в нем printfs правильный ввод), но теперь хотите установить его в нижний регистр. Итак, я попытался использовать

 if (isupper(*foo)) 
   *foo=tolower(*foo); 

т.е. когда я делаю:

printf("%s" foo); //I get the same text with upper case

Текст вроде не меняется. Спасибо.


person user2450044    schedule 04.06.2013    source источник
comment
Вы можете использовать isalpha, чтобы удалить не-альфа-символы.   -  person squiguy    schedule 04.06.2013
comment
isupper и tolower применяются только к одному символу, а не к строке.   -  person Yu Hao    schedule 04.06.2013
comment
@Yu Hao, значит, нет возможности применить его к строке?   -  person user2450044    schedule 04.06.2013
comment
Вам нужно использовать for для итерации по каждому символу строки, проверьте stackoverflow.com/questions/2661766/   -  person Yu Hao    schedule 04.06.2013


Ответы (3)


foo не является указателем, поэтому вы не хотите использовать его как указатель. Вам также не нужно проверять, является ли символ заглавной буквой перед использованием tolower - он преобразует верхний регистр в нижний, а другие символы остаются неизменными. Вероятно, вам нужно что-то вроде:

for (i=0; foo[i]; i++)
    foo[i] = tolower((unsigned char)foo[i]);

Обратите внимание, что когда вы вызываете tolowertoupper, isalpha и т. Д.), Вам действительно нужно преобразовать ваш ввод в unsigned char. В противном случае многие (большинство?) Символов за пределами базового набора символов английского языка / ASCII часто приводят к неопределенному поведению (например, в типичном случае большинство символов с диакритическими знаками будут отображаться как отрицательные числа).

Кстати, когда вы читаете строку, вы не хотите использовать scanf с %s - вы всегда хотите указать длину строки, например: scanf("%19s", foo);, предполагая, что SIZE == 20 (т. Е. Вы хотите указать на единицу меньше размера. В качестве альтернативы вы можете использовать fgets, например fgets(foo, 20, infile);. Обратите внимание, что с fgets вы указываете размер буфера, а не на единицу меньше, как с scanf (и такой компанией, как fscanf).

person Jerry Coffin    schedule 04.06.2013
comment
+1 за aside.... часть - person Bill; 04.06.2013

Попробуй это

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}
person Bill    schedule 04.06.2013
comment
что означает foo [i] в ​​середине цикла for? это похоже на i ‹foo? - person user2450044; 04.06.2013
comment
@ user2450044 ваш массив char должен / должен быть завершен нулем ... а затем этот foo[i] оценивается как false, когда достигается конец массива. - person Bill; 04.06.2013
comment
@ user2450044 Вы можете использовать foo[i] != '\0', но НЕ i <'\0'. - person Bill; 04.06.2013

*foo=tolower(*foo); //doing *(foo+i) or foo[i] does not work either

потому что все эти варианты не имеют смысла

Вы должны использовать это так:

for(i = 0; foo[i] != '\0'; i++){
    foo[i] = tolower(foo[i]);
}
person Grzegorz Piwowarek    schedule 04.06.2013
comment
что означает foo [i] в ​​середине? - person user2450044; 04.06.2013
comment
NULL или \0 ?? Я думаю, что \0 лучше, так как это массив символов. - person Bill; 04.06.2013
comment
@ Билл. Ты прав. Спасибо - person Grzegorz Piwowarek; 04.06.2013
comment
хорошо, теперь +1 за ответ :) - person Bill; 04.06.2013
comment
@ user2450044 когда-нибудь читали о циклах for в C? Приложи немного усилий, чувак, серьезно ... - person ; 04.06.2013