Я довольно новичок в 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'