OccamaRazor
@OccamaRazor

Как в Си выяснить, является ли введённая 1) строка 2) символ в верхнем или же нижнем регистре?

Не могу понять как из буквы сделать цифру, то есть чтобы символ соответствовал символу в таблице ASCII; и потом, как с помощью массива сделать ввод данных, то есть не char а полноценный string, чтобы вводилась сразу строка а не символ
char name;
scanf("%s",name);
for (i=1;i<=strlen(name);i++){
if (name >= 97 && name <= 122)
    	{ 
           printf("lower");
           name -=32;
           printf("now it is upper");
           }
if (name >= 65 && name <=90)
         	{ 
           printf("upper");
            name +=32;
             printf("now it is lower");
           }
}
  • Вопрос задан
  • 608 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Lofem
Просто объявите переменную в виде char name[100];
После обращайтесь не к name, а к name[i]
Ну и чтобы получить числовое значение символа достаточно написать int(c) или в вашем случае int(name[i])
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
> как с помощью массива сделать ввод данных, то есть не char а полноценный string, чтобы вводилась сразу строка а не символ
char s[100];
scanf("%99s", s);


Ну и заодно как обработать эту строку.
len = strlen(s);
for (i = 0; i < len; ++i) {
  name = s[i];
  // обработай как-нибудь наш name…
}


Далее буду пинать ваш код.
> scanf("%s",name);
Противная фишка Си как учебного языка. Чтобы сделать простейшие вещи, надо знать сложные концепции. Все параметры scanf, соответствующие подстановкам — %d, %s и т.д. — указатели. И тип этого указателя соответствует типу в форматной строке.
Из-за этого ваш код — явное AV (Access Violation); чтобы ввести один символ, надо scanf("%c", &name);. Чтобы ввести кучу символов — я написал выше.
Почему для s не нужен знак адреса? А потому, что массив — изначально указатель.

Вторая и третья противные фишки — принципиальная небезопасность многих функций и сложности с организацией простейшего консольного диалога. Допустим, Си из коробки не позволяет расширять строку по мере ввода, и важно ограничивать длину ввода, иначе введёшь 100 символов — будет в лучшем случае AV. А если мы введём больше 99 символов — считаем 99 и остановимся, и дальнейшие scanf’ы начнут читать «хвост».

> for (i=1;i<=strlen(name);i++) {
Явное O(n²) по процессорному времени на пустом месте. strlen ищет заканчивающий '\0', т.е. его сложность O(n). Надо запомнить длину в отдельную переменную.
Возможен и второй способ — через указатели.
char* p;
for (p = s; *p != '\0' ++p) {

Это более эффективный, но и более продвинутый способ.

> if (name >= 97 && name <= 122)
А почему бы не написать так: if (name >= 'a' && name <= 'z')? Константы 'a' и 'z' — в Си это тот же int, в C++ char (видимо, для совместимости с перегрузкой функций).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы