2010-01-07 56 views
1

我传递一个空的字符数组,我需要递归使用strcat()填充。但是,在VS调试器中,数组不是空的,它充满了我不认识的一些奇怪的垃圾字符。 strcat()然后追加到这些垃圾字符的末尾,而不是在数组的前面。VS2008中的char []问题 - 为什么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*

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

+1

编码[0] ='\ 0'应该可以工作,你在调用text_to_binary之前是否做过这个? – 2010-01-07 16:07:55

+1

“junk character”是十六进制的0xcc Debug build(在Visual C++下)使用此值初始化堆栈变量以帮助在调试时显示未初始化的变量用法ING。 – 2010-01-07 16:21:29

回答

6

您还没有初始化数组。变化:

char encoded[512]; 

char encoded[512] = ""; 
3

strcat的附加到字符串的末尾,端部由一个\ 0标记,则它附加一个\ 0到新的结束位置。

您应清除编码为[0] = 0的目标;或memset首先。

2

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

+1

调试堆使用'0xcd'。 '0xcc'用于堆栈上未初始化的变量。 – 2010-01-07 16:24:27

+1

所有非常特定的编译器。如果你提到这个细节,同时提到编译器和操作系统。 – 2010-01-07 17:24:47

+0

我的歉意。 Andreas的回答和我的评论都是针对Microsoft Visual C++调试运行时(至少从Visual Studio 2005开始)。 – 2010-01-07 18:46:15

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:我没有试过源代码,所以如果出现错误,请添加注释,我会更正它。

您的项目的良好延续。

+0

是的,谢谢,我知道所有这些,这只是一个简单的例子 – tgh 2010-01-07 16:18:11

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

0
  1. 你没有连接ascii_to_binary的来源,让我们假定它会填满缓冲区的字符的十六进制转储(如果这是它更容易使用sprintf(encoded+(i2),"%2x",*(str+i));
  2. 的情况下什么是递归调用text_to_binary点?我认为这可能是一个问题
相关问题