C printf修改字符串
使用C printf修改字符串,c,printf,C,Printf,使用printf打印“\4unix\5lancs\2ac\2uk\0”我发现,不是以♦unix♣兰克斯☻交流电☻在英国,我收到垃圾(♫ ,►Eα§Qh↕) 我找不到对此的解释;我使用以下方法标记字符串: /** * Encode the passed string into a string as defined in the RFC. */ char * encodeString(char *string) { char stringCopy[128]; char enco
printf
打印“\4unix\5lancs\2ac\2uk\0”
我发现,不是以♦unix♣兰克斯☻交流电☻在英国,我收到垃圾(♫ ,►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”
:
如果我在encodeString
方法的末尾添加一个printf
来打印encodedString
,我不会打印垃圾(而是♦unix♣兰克斯☻交流电☻英国
两次)
(调试时,我注意到实际内存内容发生了更改。)
有人能给我解释一下这种现象吗?当你说:
return encodedString;
您返回的是一个局部变量,当您开始使用它时,它将不再存在。一个快速的解决方法是将encodedString设置为静态。当您说:
return encodedString;
您返回的是一个局部变量,当您开始使用它时,它将不再存在。一个快速的解决方法是使encodedString静态。不要使用返回字符串的函数
将字符串地址作为参数发送并在函数中更改
编译器应该显示一个警告不要忽略编译器警告,尤其是在C语言中。
您的函数应该如下所示:
void encodeString(char *string, char *encodedString)
{
.
.
.
}
请参见不要使用返回字符串的函数
将字符串地址作为参数发送并在函数中更改
编译器应该显示一个警告不要忽略编译器警告,尤其是在C语言中。
您的函数应该如下所示:
void encodeString(char *string, char *encodedString)
{
.
.
.
}
请参见返回指向数组的指针encodedString
,该数组是encodeString()
函数的本地指针,具有自动存储持续时间
该函数退出后,该内存不再有效,这就是导致问题的原因
您可以通过提供encodedString
静态存储持续时间来修复它:
static char encodedString[128];
encodedString[0] = '\0';
(您不能再使用初始化器清空数组,因为具有静态存储持续时间的数组会在函数的一次调用到下一次调用时保持其值。)您将返回一个指向数组encodedString
,该数组是encodeString()的本地指针
功能,并具有自动存储持续时间
该函数退出后,该内存不再有效,这就是导致问题的原因
您可以通过提供encodedString
静态存储持续时间来修复它:
static char encodedString[128];
encodedString[0] = '\0';
(您不能再使用初始化器清空数组,因为具有静态存储持续时间的数组会在函数的一次调用到下一次调用之间保持其值。)干杯!但这并不能解释为什么如果我在encodeString方法中调用printf,那么当我在main中调用printf时,内存不会被释放,你知道为什么会发生这种情况吗?这只是当你打破C中的规则时,你会得到的许多奇怪的表现之一。区别在于对printf()的额外调用
函数内部会改变堆栈上的内容-这就是主函数中错误的printf
调用遇到的堆栈上的剩余内容。干杯!但这并不能解释为什么如果我在encodeString方法中调用printf,那么当我在main中调用printf时,内存不会被释放,你知道为什么会发生这种情况吗?这只是当你打破C中的规则时,你会得到的许多奇怪的表现之一。区别在于对printf()的额外调用
函数内部改变堆栈上的内容-以及主函数中异常的printf
调用遇到的堆栈上的剩余内容。欢迎您的建议!我知道很多标准方法都是这样工作的。第一句话有点严格,第二句话非常正确。试试这个:char*encodeString(constchar*string,char*encodedString);当返回值为encodedString时(您仍然可以在表达式中使用它),为您的建议干杯!我知道很多标准方法都是这样工作的。第一句话有点严格,第二句话非常正确。试试这个:char*encodeString(constchar*string,char*encodedString);其中返回值为encodedString(您仍然可以在表达式等中使用它)