Я новичок в C, и я не понимаю, почему мой код не работает. Цель состоит в том, чтобы просто перевернуть строку.
char word[20];
int i, len;
printf("Enter word: ");
scanf("%s", &word);
len = strlen(word);
printf("String reversed: ");
for (i = len-1; i >= 0; i--){
printf("%s", word[i]);
}
printf("%s", word[i]);
-> putchar(word[i]);
@Someprogrammerdude word[i] должен содержать строку, введенную пользователем, а %s — спецификатор формата для строки
word[i]
— это сингл char
. Формат %s
сообщает printf()
, что печатается строка (набор char
, а не один char
). Эта разница вызывает неопределенное поведение.
Должно появиться предупреждение компилятора
@PSkocik, это сработало, но я не понимаю, как? Я думал, что у putchar и scanf одинаковые функции.
@AnttiHaapala - предупреждение компилятора не требуется. Некоторые компиляторы делают это (качество реализации, помощь программисту), но на самом деле от них этого не требуется.
Просто измените printf("%s", word[i]);
на printf("%c", word[i]);
. Вы печатаете символы, а не строки
word
содержит строку байтов, заканчивающуюся нулем. word[i]
— это один символ (один char
) из этой строки.
В
printf("%s", word[i]);
%s — неправильный формат, потому что вы пишете символ, а не строку
Из этого:
естественный тип для индекса size_t
не инт, используйте size_t
как для я, так и для Лен, и в этом случае измените цикл, чтобы использовать индекс, не предполагая, что он может быть отрицательным
если входная строка содержит более 19 символов, сканф будет записывать из слово с неопределенным поведением, ограничьте размер, используя формат %19s (19, а не 20, чтобы было место для конечного нулевого символа)
слово — это массив, не используйте '&' для указания его адреса в сканф.
проверьте результат сканф, если вы хотите обнаружить EOF
очистить вывод, написав новую строку после цикла
Итак, возможный способ:
char word[20];
printf("Enter word: ");
if (scanf("%19s", word) == 1) {
printf("String reversed: ");
for (size_t i = strlen(word); i != 0; i--){
printf("%c", word[i-1]);
}
putchar('\n');
}
При выполнении цикла в обратном порядке с условием i >= 0
необходимо использовать тип signed
(например, int
). С типом unsigned
(например, size_t
) условие всегда истинно, и цикл никогда не заканчивается (и дает неопределенное поведение).
@ Питер, ты прав, я отредактировал свой ответ, чтобы изменить цикл
Почему бы не использовать putchar() вместо printf()?
@БьорнаА. Я повторно использовал printf, чтобы указать изменение в OP, даже использовать printf очень дорого, потому что ничего не писать только один символ, поэтому я не использую printf снова для новой строки :-) Что вы имеете в виду под «не обрабатывает пустые строки хорошо" ? Я хорошо справляюсь с ними.. Я имею в виду, как я хочу
@БьорнаА. вы отредактировали свое замечание (после того, как я на все ответил), но вы не удалили свой DV, полагая, что это были вы, почему?
@bruno У меня только что был «старший момент» с этим кратким циклическим комментарием. Все мое плохое. Я ничего не минусовал, кстати. Я проголосовал за ваш комментарий. Это был я.
@БьорнаА. ах хорошо, спасибо за ответ и извините за мое неправильное предположение :-)
Что такое
word[i]
? В каком формате"%s"
должен печатать? Какой формат используется для печати отдельных символов?