Я пишу функцию поворота строки в C. Предполагаемое поведение заключается в том, что символы строк будут вращаться с использованием модуля длины строки и ключа. Кажется, что функция работает в прямом направлении, но если я укажу отрицательный ключ, я хочу, чтобы строка вращалась в противоположном направлении, и именно здесь есть ошибка. В целях полноты / тестирования я предоставлю всю программу, но ниже я выделю проблемную область и объясню, что я сделал для отладки:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
char* rotate_str(char *mutable_str, int key);
int main(void)
{
char str[] = "This is a test.";
char * output = rotate_str(str, -2);
printf("%s\n", output);
return EXIT_SUCCESS;
}
//Bug - negative rotate doesn't work properly - test with -2
char* rotate_str(char *mutable_str, int key)
{
assert(mutable_str);
size_t len = strlen(mutable_str);
ssize_t i;
char *output = malloc(len+1);
assert(output);
ssize_t rotated_index = 0;
for(i =0; i < len; ++i)
{
rotated_index = (i + key) % len; // Get the new index position
output[rotated_index] = mutable_str[i];
}
output[len] = '\0';
return output;
}
Проблема заключается в следующем:
for(i =0; i < len; ++i)
{
rotated_index = (i + key) % len; // Get the new index position
output[rotated_index] = mutable_str[i];
}
На первой итерации i = 0
, key = -2
и len = 15
. Когда я вычисляю -2 + 0 % 15
с помощью калькулятора (в данном случае Google), я получаю 13
. Тем не менее, моя C программа делает rotated_index = 14
согласно выводу моего отладчика. Так что это само по себе уже является проблемой.
Когда я делаю положительное 2
как key
, я получаю вывод: t.This is a tes
, что я и ожидал. Но когда я делаю -2
как key
, я получаю вывод: is is a test.
, но ожидаемый вывод is is a test.Th