我试图编写一个以字符串长度为前缀的函数。我似乎无法将char []分配给char *。神秘的是,如果我在分配之前打印出一些调试代码,它就可以工作。
char *prefixMsgWLength(char *msg){
char *msgWLength;
int msgLength = strlen(msg);
if (msgLength == 0){
msgWLength = "2|";
}
else{
int nDigits = floor(log10(abs(msgLength))) + 1;
int nDigits2 = floor(log10(abs(msgLength + nDigits + 1))) + 1;
if (nDigits2 > nDigits){
nDigits = nDigits2;
}
msgLength += nDigits + 1;
char prefix[msgLength];
sprintf(prefix, "%d|", msgLength);
strcat(prefix, msg);
// if I uncomment the below, msgWLength is returned correctly
// printf("msg: %s\n", prefix);
msgWLength = prefix;
}
return msgWLength;
}
答案 0 :(得分:2)
代码中的问题是
msgWLength = prefix;
在这里,您将局部变量(prefix
)的地址分配给指针,然后尝试return
它。
一旦函数完成执行,局部变量将超出范围,返回的指针将无效。
您需要将prefix
作为指针并动态分配内存,如果您希望它在从函数返回后保留存在。
答案 1 :(得分:0)
在C中,将字符串重新分配到精确的长度可能非常麻烦。使用足够大的缓冲区可能会好得多。在这里,我使用limits.h
根据系统(LINE_MAX
)确定行缓冲区的大小:
#include <stdio.h>
#include <limits.h>
#include <string.h>
int main()
{
/* Our message */
char const msg[] = "Hello, world!";
/* Buffer to hold the result */
char buffer[LINE_MAX];
/* Prefix msg with length */
snprintf(buffer, LINE_MAX, "%lu|%s", strlen(msg)+1, msg);
/* Print result */
printf("%s\n", buffer);
return 0;
}