Переворачивание строки в C с использованием цикла for

Я новичок в 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]);
}

Что такое word[i]? В каком формате "%s" должен печатать? Какой формат используется для печати отдельных символов?

Some programmer dude 29.05.2019 16:26
printf("%s", word[i]); -> putchar(word[i]);
PSkocik 29.05.2019 16:27

@Someprogrammerdude word[i] должен содержать строку, введенную пользователем, а %s — спецификатор формата для строки

hi_it'sme 29.05.2019 16:29
word[i] — это сингл char. Формат %s сообщает printf(), что печатается строка (набор char, а не один char). Эта разница вызывает неопределенное поведение.
Peter 29.05.2019 16:29

Должно появиться предупреждение компилятора

Antti Haapala -- Слава Україні 29.05.2019 16:30

@PSkocik, это сработало, но я не понимаю, как? Я думал, что у putchar и scanf одинаковые функции.

hi_it'sme 29.05.2019 16:32

@AnttiHaapala - предупреждение компилятора не требуется. Некоторые компиляторы делают это (качество реализации, помощь программисту), но на самом деле от них этого не требуется.

Peter 29.05.2019 16:32

Просто измените printf("%s", word[i]); на printf("%c", word[i]);. Вы печатаете символы, а не строки

EUS 29.05.2019 16:33
word содержит строку байтов, заканчивающуюся нулем. word[i] — это один символ (один char) из этой строки.
Some programmer dude 29.05.2019 16:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
208
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В

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) условие всегда истинно, и цикл никогда не заканчивается (и дает неопределенное поведение).

Peter 29.05.2019 16:35

@ Питер, ты прав, я отредактировал свой ответ, чтобы изменить цикл

bruno 29.05.2019 16:36

Почему бы не использовать putchar() вместо printf()?

Bjorn A. 29.05.2019 18:21

@БьорнаА. Я повторно использовал printf, чтобы указать изменение в OP, даже использовать printf очень дорого, потому что ничего не писать только один символ, поэтому я не использую printf снова для новой строки :-) Что вы имеете в виду под «не обрабатывает пустые строки хорошо" ? Я хорошо справляюсь с ними.. Я имею в виду, как я хочу

bruno 29.05.2019 18:25

@БьорнаА. вы отредактировали свое замечание (после того, как я на все ответил), но вы не удалили свой DV, полагая, что это были вы, почему?

bruno 29.05.2019 19:55

@bruno У меня только что был «старший момент» с этим кратким циклическим комментарием. Все мое плохое. Я ничего не минусовал, кстати. Я проголосовал за ваш комментарий. Это был я.

Bjorn A. 02.06.2019 20:32

@БьорнаА. ах хорошо, спасибо за ответ и извините за мое неправильное предположение :-)

bruno 02.06.2019 20:38

Другие вопросы по теме