Почему эта модульная арифметика c неверна в моей функции поворота строки? - PullRequest
0 голосов
/ 25 марта 2020

Я пишу функцию поворота строки в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...