Рекомендации по решению UD в низкоуровневых функциях управления - PullRequest
1 голос
/ 16 мая 2011

Я довольно новичок в C и начал писать небольшую библиотеку с функциями для получения длины строк, обращения строк, преобразования двоичных данных в буферах символов в целые и короткие. Просто ради образования и лучшего понимания функций низкого уровня, которые уже доступны в string.h и т. Д.

Проблема в том, что мои ошибки в некоторой степени случайны. У меня есть 4 функции:

  • getStringLength (Получает длину строки)
  • reverseString (инвертирует строку, используя замену XOR и используя getStringLength для получения длины)
  • charsToUShort (Преобразует указатель массива символов с двумя байтами (не считая нулевого члена) двоичных данных в беззнаковое короткое замыкание)
  • charsToUInt (Преобразует указатель массива char с четырьмя байтами (не считая нулевого члена) двоичных данных в целое число без знака)

В основном проблема возникает, когда я проверяю все эти функции в своей основной функции. Когда используются все функции, итератор в reverseString, который будет переходить от 0 к length / 2, устанавливается как 32767. Таким образом, в основном, когда итерация строки повторяется, цикл даже не запускается, поскольку итератор равен 32767. Несмотря на это, он инициализируется как 0. Если я использую только 3 из них для функций, например, если я удаляю charsToUInt i из моей основной функции, все это работает как положено.

Основной вопрос

  • Какой совет вы можете решить, как решить эту проблему?
  • Все остальные советы также очень приветствуются!

Ошибка склонен код для уточнения

getStringLength

unsigned int getStringLength(char *str){
    unsigned int i = 0;

    while(str[i]){
        i++;
    }

    return i;
}

reverseString

void reverseString(char *str){
    int i, m = 0;
    unsigned int l = getStringLength(str);

    m = l >> 1;

    while(i < m){
        str[i] ^= str[l - 1];
        str[l - 1] ^= str[i];
        str[i] ^= str[l - 1];
        i++;
        l--;
    }
}

charsToUShort

unsigned short charsToUShort(char *str){
    unsigned int l = getStringLength(str);
    unsigned short result = 0;

    if(l != 2){
        return 0;
    }else{
        result |= str[0] << 8;
        result |= str[1] << 0;
        return result;
    }
}

charsToUInt

unsigned int charsToUInt(char *str){
    unsigned int l = getStringLength(str);
    unsigned int result = 0;

    if(l != 4){
        return 0;
    }else{
        result |= str[0] << 24;
        result |= str[1] << 16;
        result |= str[2] << 8;
        result |= str[3] << 0;
        return result;
    }
}

Тестовый вывод для уточнения

Вот результат тестирования с результатом ошибки:

0: reverseString failed! Expected value: 'olleH', actual value: 'Hello'
1: charsToUShort passed! Expected value: '0x6261', actual value: '0x6261'
2: charsToUInt passed! Expected value: '0x62616364', actual value: '0x62616364'

А вот и ожидаемый результат:

0: reverseString passed! Expected value: 'olleH', actual value: 'olleH'
1: charsToUShort passed! Expected value: '0x6261', actual value: '0x6261'
2: charsToUInt passed! Expected value: '0x62616364', actual value: '0x62616364'

1 Ответ

4 голосов
/ 16 мая 2011

Ваш код устанавливает только m в ноль, i остается неинициализированным, вы хотите int i = 0, m = 0;, иначе цикл никогда не выполнит ни одной итерации

...