Имитировать функцию strrev (), сумасшедший вывод

#c #function #codeblocks

#c #функция #codeblocks

Вопрос:

Я должен имитировать работу функции strrev() с надписью от меня. Однако я не понимаю, почему у меня есть ряд специальных символов, которые не имеют смысла в качестве выходных данных, пока вы полностью не остановите программу. Я также попытался выяснить, была ли проблема в индексе «i» с прокомментированной строкой кода, но все в порядке. В чем может быть проблема? Спасибо!

 void strrev_new(char *s_to_rev) {
  int i = 0;
  int length = 0;
  length = strlen(s_to_rev);
  for (i = 0; i < length; i  ) {
    s_to_rev[length - i] = s_to_rev[i];
    // printf("%d   -----    %dn", (length-i), i);
  }
}
  

Комментарии:

1. Нужны ваши данные.

2. Строка пользователем, без специального символа и с пробелом

3. Вы должны обрабатывать случаи возврата для таких функций.

4. Вам не нужно предварительно объявлять переменные. Объявите их там, где они вам нужны, и инициализируйте их правильным значением, а не фиктивным (например, 0) значением. Это делает ваш код более коротким и более читаемым, а также дает меньше возможностей для проникновения недопустимых значений в вашу логику.

Ответ №1:

У вас ошибка «один за другим», поскольку strlen() возвращает длину строки (например, 5 для hello ), но последний индекс в строке равен 4 (считая от 0).

Попробуйте

 s_to_rev[length - 1 - i] = s_to_rev[i];
  

Комментарии:

1. хорошо, теперь это работает, но не переворачивайте строку, только наполовину

2. Да, потому что вы перезаписываете вторую половину по ходу работы. Это еще одна ошибка, которую вам нужно решить 😉

3. это имеет смысл, я мог бы исправить это, начиная с длины / 2, но только если строка четная или нет?

4. Возможно, вы захотите рассмотреть возможность итерации только до длины / 2 и замены символов друг с другом. 🙂

Ответ №2:

В вашем коде есть две проблемы. Первое, блестяще замеченное @AKX, заключается в том, что вы пишете, начиная с str[length] символа вместо str[length-1] (в C индексы массива начинаются с 0).

Вторая проблема является следствием того факта, что вы пытаетесь изменить строку на место, то есть без использования вспомогательного массива.

С помощью цикла

 for (i = 0; i < length; i  ) {
    s_to_rev[length - i] = s_to_rev[i];
}
  

вы правильно начинаете обновлять последние элементы массива. Но как только вы дойдете до половины строки, символы at s_to_rev[i] больше не являются исходными, поскольку вы обновили их ранее!

Попробуйте вместо этого обойти половину строки и поменять местами символы (просто используйте временную char переменную):

 for (i = 0; i < length/2; i  ) {
    char tmp = s_to_rev[length - i -1],
    s_to_rev[length - i -1] = s_to_rev[i];
    s_to_rev[i]  = tmp;
}