> как с помощью массива сделать ввод данных, то есть не 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 (видимо, для совместимости с перегрузкой функций).