Функции для символов
В библиотеке ctype.h есть функции, работающие с одним символом. Две из них его меняют:
toupper(c)даёт заглавную букву:toupper('a')— это'A';tolower(c)даёт строчную букву:tolower('Q')— это'q'.
Остальные символы остаются как есть: toupper('5') — это '5', а toupper('A') — это 'A'.
#include <ctype.h>
#include <stdio.h>
int main(void) {
char name[] = "eva";
name[0] = toupper(name[0]);
printf("%s\n", name);
return 0;
}Это выведет:
Evatoupper не меняет символ, который вы ей передали. Она даёт вам новый символ, и его нужно сохранить: name[0] = toupper(name[0]);. Строка с одним лишь toupper(name[0]); скомпилируется, но имя останется eva, потому что новый символ выбрасывается. (Результат — число типа int, код символа. Когда вы сохраняете его в char или выводите через %c, это снова символ.)
Другие функции отвечают на вопрос о символе:
isupper(c): это заглавная буква?isalpha(c): это буква?isdigit(c): это цифра, от'0'до'9'?
Ответ — число: 0 означает «нет», а любое другое число — «да». Поэтому используйте их прямо как условие, как вы знаете из урока об условиях: if (isdigit(c)). Этот цикл считает цифры в коде:
char code[] = "R2D2";
int digits = 0;
for (int i = 0; code[i] != '\0'; i++) {
if (isdigit(code[i])) {
digits++;
}
}
printf("Цифр: %d\n", digits);Это выведет:
Цифр: 2Эти функции знают только буквы английского алфавита, без диакритических знаков (и русских букв они тоже не знают). Ещё одна причина писать строки, которые вы обходите посимвольно, латиницей.
Задание
- 1
Кто-то набрал город при включённом Caps Lock. Добавьте
#include <ctype.h>и исправьтеcity: сделайте первый символ заглавным с помощьюtoupper, а все остальные — строчными с помощьюtolower, в цикле, который начинается с индекса 1. Затем выведите его:Исправлено: Prague. - 2
Ниже создайте
char code[] = "B4X-27Q9";. Пройдите по нему в цикле, сосчитайте цифры с помощьюisdigitи буквы с помощьюisalphaи выведитеЦифр: 4, букв: 3.