我正在传递一个空的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*
。
编辑:这是数组中的垃圾字符: ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ...
答案 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)
sprintf(encoded+(i2),"%2x",*(str+i));