foo
не указатель, поэтому вы не хотите использовать его как один. Вам также не нужно проверять, является ли символ верхней буквой перед использованием tolower
- он преобразует верхний и нижний регистр и оставляет другие символы без изменений. Вы, наверное, хотите что-то вроде:
for (i=0; foo[i]; i++)
foo[i] = tolower((unsigned char)foo[i]);
Обратите внимание, что при вызове tolower
(и toupper
, isalpha
и т.д.) вам действительно нужно, чтобы отдать свой вклад в unsigned char
. В противном случае многие (большинство?) Символов вне основного набора символов английского/ASCII часто приводят к неопределенному поведению (например, в типичном случае наиболее акцентированные символы будут отображаться как отрицательные числа).
Как и в сторону, когда вы читаете строку, вы не хотите использовать scanf
с %s
- вы всегда хотите, чтобы указать длину строки, что-то вроде: scanf("%19s", foo);
, предполагая SIZE
== 20 (то есть, Обратите внимание, что с fgets
вы указываете размер буфера, а не один меньше, чем вы, с scanf
(и компанией, подобной fscanf).
fgets(foo, 20, infile);
.
Вы можете использовать ['isalpha'] (http://www.cplusplus.com/reference/cctype/isalpha/), чтобы удалить неабсолютные символы. – squiguy
' isupper' и 'tolower' применяется только к одному символу, не строка. –
@Yu Hao, поэтому нет способа применить его к строке? – user2450044