2013-06-04 5 views
4

У меня есть char foo[SIZE]; //(string)Как установить строку в нижнем регистре

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

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

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

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

текст, кажется, не меняется. Спасибо.

+0

Вы можете использовать ['isalpha'] (http://www.cplusplus.com/reference/cctype/isalpha/), чтобы удалить неабсолютные символы. – squiguy

+1

' isupper' и 'tolower' применяется только к одному символу, не строка. –

+0

@Yu Hao, поэтому нет способа применить его к строке? – user2450044

ответ

2

Попробуйте

for(i = 0; foo[i]; i++){ 
    foo[i] = tolower(foo[i]); 
} 
+1

Что означает foo [i] в ​​середине цикла for? что, как i user2450044

+0

@ user2450044 ваш массив символов должен/должен быть завершен с нулем ... а затем, что 'foo [i]' оценивается как 'false', когда достигнут конец массива. – Bill

+0

@ user2450044 Вы можете использовать 'foo [i]! = '\ 0'', но НЕ' i <' \ 0''. – Bill

2

*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]); 
} 
+0

Что означает foo [i] в ​​середине? – user2450044

+0

NULL или '\ 0' ?? Я думаю, что '\ 0' лучше, так как это массив символов. – Bill

+0

@Bill Вы правы. Спасибо –

4

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 вы указываете размер буфера, а не один меньше, чем вы, с scanf (и компанией, подобной fscanf).

fgets(foo, 20, infile);.
+0

+1 для части «' в сторону .... '» – Bill

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