私はCにかなり慣れていないので、文字列の長さを取得し、文字列を反転し、charバッファーのバイナリデータをintとshortに変換する機能を備えた小さなライブラリを書き始めました。教育のため、および string.h などですでに利用可能な低レベルの機能をよりよく理解するためです。
問題は、私が抱えているエラーがある程度ランダムであることです。私は4つの機能を持っています:
getStringLength
(文字列の長さを取得します)reverseString
(XOR 置換を使用して文字列を反転し、getStringLength を使用して長さを取得します)charsToUShort
(バイナリ データの 2 バイト (null 項はカウントしない) を持つ char 配列ポインタを unsigned short に変換します)charsToUInt
(バイナリ データの 4 バイト (null 項はカウントしない) を持つ char 配列ポインタを unsigned int に変換します)
基本的に、メイン関数でこれらすべての関数をテストすると問題が発生します。すべての関数が使用される場合、 toreverseString
に移動するイテレータは として設定されます。したがって、基本的に、文字列の反転が繰り返されると、イテレータが であるため、ループは開始されません。それにもかかわらず、それは 0 として初期化されます。関数にこれらのうち 3 つしか使用しない場合、たとえば、メイン関数から charsToUInt を削除すると、すべて期待どおりに機能します。0
length / 2
32767
32767
主な質問
- このような問題を解決するには、どのようなアドバイスが必要ですか?
- その他のアドバイスも大歓迎です!
明確化のためのエラーが発生しやすいコード
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'