printf修改字符串

时间:2009-12-04 11:17:53

标签: c printf

使用printf打印"\4unix\5lancs\2ac\2uk\0"我找到了♦unix♣lancs☻ac☻uk,而不是♫ ,►E¦§Qh ↕形式的打印件,我得到了垃圾邮件(/** * Encode the passed string into a string as defined in the RFC. */ char * encodeString(char *string) { char stringCopy[128]; char encodedString[128] = ""; char *token; /* We copy the passed string as strtok mutates its argument. */ strcpy(stringCopy, string); /* We tokenise the string on periods. */ token = strtok(stringCopy, "."); while (token != NULL) { char encodedToken[128] = ""; /* Encode the token. */ encodedToken[0] = (char) strlen(token); strcat(encodedToken, token); /* Add the encodedString token to the encodedString string. */ strcat(encodedString, encodedToken); /* Prepare for the next iteration. */ token = strtok(NULL, "."); } /* A null character is appended already to the encoded string. */ return encodedString; } )。

我无法找到解释;我使用以下方法来标记字符串:

"unix.lancs.ac.uk"

我的驱动程序中的以下代码用于在标记int main(int argc, char *argv[]) { char *foo = "unix.lancs.ac.uk"; char *bar = encodeString(foo); printf("%s\n", bar); return 0; } 时打印结果:

printf

如果我在encodedString方法的末尾添加encodeString来打印♦unix♣lancs☻ac☻uk,我就不会打印出垃圾(而是{{1}}两次)。

(调试时我注意到实际的内存内容已经改变。)

有人能向我解释这个现象吗?

3 个答案:

答案 0 :(得分:8)

您正在返回指向数组encodedString的指针,该数组是encodeString()函数的本地数据,并具有自动存储持续时间。

该功能退出后,此内存不再有效,这是造成问题的原因。

您可以通过提供encodedString静态存储时间来修复它:

static char encodedString[128];

encodedString[0] = '\0';

(您不能再使用初始化器来清空数组,因为具有静态存储持续时间的数组会保持其值从一次调用函数到下一次。)

答案 1 :(得分:4)

当你说:

 return encodedString;

你正在返回一个局部变量,当你使用它时它将不复存在。快速破解就是将encodedString设为静态。

答案 2 :(得分:3)

不要使用返回字符串的函数。

将字符串地址作为参数发送并在函数中更改。

编译器应显示警告。 请勿忽略编译器警告,尤其是在C。

你的功能应该是这样的:

void encodeString(char *string, char *encodedString)
{
.
.
.
}

请参阅here