#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;
}