拆分字符数组添加(看似)随机字符

时间:2015-05-09 19:54:33

标签: c++ arrays

我很确定这是一个新手的错误,但我无法弄清楚。我尝试制作回文检查器,但每当我尝试将传递的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�

2 个答案:

答案 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 << lhstd::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;