在VS2008中使用char []的问题 - 为什么strcat附加到空数组的末尾?

时间:2010-01-07 16:03:20

标签: c++ arrays char

我正在传递一个空的char数组,我需要使用strcat()递归填充。但是,在VS调试器中,数组不是空的,它充满了一些我不认识的奇怪的垃圾字符。然后strcat()追加到这些垃圾字符的末尾而不是数组的前面。

我还尝试encoded[0] = '\0'在传递数组之前清除垃圾,但是strcat()不会在递归调用上附加任何内容。

这是提供数组并调用递归函数的代码:

char encoded[512];
text_to_binary("Some text", encoded);

这是递归函数:

void text_to_binary(const char* str, char* encoded)
{   
    char bintemp[9];
    bintemp[0] = '\0';

    while(*str != '\0')
    {
        ascii_to_binary(*str, bintemp);
        strcat(encoded, bintemp);
        str++;
        text_to_binary(str, encoded);
    }
}

发生了什么事?

PS。我无法使用std::string - 我坚持使用char*

编辑:这是数组中的垃圾字符: ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ...

6 个答案:

答案 0 :(得分:6)

您没有初始化阵列。变化:

char encoded[512];

char encoded[512] = "";

答案 1 :(得分:3)

strcat追加到字符串的末尾,结尾用\ 0标记,然后将\ 0附加到新的结束位置。

您应该清除编码为[0] = 0的目的地;或先忘记。

答案 2 :(得分:2)

char encoded[512]; .. encoded未初始化,将包含垃圾(或调试版本中的0xCCCCCCCC)。

答案 3 :(得分:1)

您的问题是由于我认为编码初始化。关于你的计划的一些评论:

最好避免递归    功能,当你可以用一个    循环。

其次你应该添加大小    编码以避免可能的溢出    错误(在字符串大小的情况下)    比编码大。)

void text_to_binary(const char* str, char* encoded)
{   
    char bintemp[9];
    bintemp[0] = '\0';
    encode[0] = '\0';

    for(const char *i = str; i!='\0'; i++)
    {
        ascii_to_binary(*i, bintemp);
        strcat(encoded, bintemp);
    }
}

PS:我没有尝试过源代码,所以如果有错误添加评论,我会更正。

您项目的良好关系。

答案 4 :(得分:1)

您已立即发布了针对您当前问题的解决方案,但您的text_to_binary仍然效率低下。实质上,您在循环中调用strcat,并且始终使用相同的字符串进行连接,并且strcat需要遍历字符串以查找其结尾。这使您的算法二次。您应该做的是自己跟踪encoded的结尾,并将bintemp的内容直接放在那里。编写循环的更好方法是

while(*str != '\0')
{
    ascii_to_binary(*str, bintemp);
    strcpy(encoded, bintemp);
    encoded += strlen(bintemp);
    str++;
}

您不需要递归,因为您已经在str上循环(我相信这是正确的,因为您的原始代码会非常奇怪地填充encoded)。此外,在修改后的版本中,encoded始终指向原始encoded字符串的末尾,因此您只需使用strcpy代替strcat

答案 5 :(得分:0)

  1. 你没有附上ascii_to_binary的来源,让我们假设它会用char的十六进制转储填充缓冲区(如果是这种情况则更容易使用sprintf(encoded+(i2),"%2x",*(str+i));
  2. 递归调用text_to_binary有什么意义?我认为这可能是一个问题。