我很确定这是一个新手的错误,但我无法弄清楚。我尝试制作回文检查器,但每当我尝试将传递的char数组分成两半时,它会在split char数组的末尾添加随机(?)字符。我试过谷歌搜索但无济于事。也许它与空终止字符串有关,但char数组的长度表示除了我传递的字符之外没有其他字符。代码在这里:
#include <iostream>
bool isPalindrome(char* passedString){
int len = strlen(passedString);
char lh[len/2];
char rh[len/2];
std::cout << "Length is: " << len << std::endl;
if(len % 2 == 0){
for(int i = 0; i < len/2; i++){
lh[i] = passedString[i];
}
int tmpCount = 0;
for(int i = len/2; i < len; i++){
rh[tmpCount] = passedString[i];
tmpCount++;
}
}
std::cout << "Left half: " << lh << std::endl << "Right half: " << rh << std::endl;
return 0;
}
int main(){
isPalindrome("test");
return 0;
}
编译并执行后返回此输出:
Length is: 4
Left half: te�Y�
Right half: st�Y�
答案 0 :(得分:2)
制作两个大小为len/2+1
的数组,并在每个数组的最后位置添加\0
。
有关字符串如何使用数组和指针的更多信息,您可以查看以下链接:http://www.cs.bu.edu/teaching/c/string/intro/
答案 1 :(得分:2)
首先,字符串文字具有常量字符数组的类型。因此,如果你想调用传递给它的函数一个字符串文字,它必须被声明为
bool isPalindrome( const char *passedString );
其次,C ++中没有可变长度数组(尽管有些编译器可以支持它们)。所以这些声明
char lh[len/2];
char rh[len/2];
不是有效的C ++声明。
两个字符数组都不包含零终结字符串。所以这句话
std::cout << "Left half: " << lh << std::endl << "Right half: " << rh << std::endl;
可以输出一些垃圾。
而不是std::cout << lh
或std::cout << rh
使用
std::cout.write( lh, len / 2 );
和
std::cout.write( rh, len / 2 );
例如
std::cout << "Left half: ";
std::cout.write( lh, len / 2 );
std::cout << std::endl << "Right half: ";
std::cout.write( rh, len / 2 ) << std::endl;