我在Linux上使用ANSI C和gcc进行项目,并且我正在尝试为自己编写一些实用程序函数以使头发变得更容易。特别是,我试图写一个" safe"字符串连接函数,它使用固定的内存大小,并确保我永远不会超过这个大小。这是我写这个函数的第一个错误:
#define STRING_SIZE 1024
#define MIN(a, b) (a < b ? a : b)
void concatenate1(char *dest, const char *src)
{
if (dest == NULL) {
dest = malloc(STRING_SIZE);
strncpy(dest, src, MIN(strlen(src), STRING_SIZE));
} else {
strncat(dest, src, STRING_SIZE - strlen(dest));
}
}
我的想法是我可以声明我的字符串(char-pointer),然后重复开始添加它,不需要区分用第一个值初始化字符串或连接到现有值,因为函数会处理它对我来说。换句话说,这里有一些代码展示了这一点:
int main(void)
{
char *myString;
concatenate1(myString, "The ");
concatenate1(myString, "quick ");
concatenate1(myString, "brown ");
concatenate1(myString, "fox");
printf("%s\n", myString);
return 0;
}
麻烦的是,这会导致分段错误。所以我写了这个版本:
void concatenate2(char **dest, const char *src)
{
if (**dest == 0) {
*dest = malloc(STRING_SIZE);
strncpy(*dest, src, MIN(strlen(src), STRING_SIZE));
} else {
strncat(*dest, src, STRING_SIZE - strlen(*dest));
}
}
我用这段代码调用它:
int main(void)
{
char *myString;
concatenate2(&myString, "The ");
concatenate2(&myString, "quick ");
concatenate2(&myString, "brown ");
concatenate2(&myString, "fox");
printf("%s\n", myString);
return 0;
}
该版本运行正常。但我承认我觉得有点烦人,我现在必须在我的变量前加上&
才能使函数正常工作。我的第一个版本出了什么问题?有没有办法将char指针传递给函数并直接修改它,或者这是更新C中现有字符串的唯一合法方法吗?
答案 0 :(得分:1)
您的第一个示例不起作用,因为在您的函数中设置dest = malloc(STRING_SIZE);
仅在本地设置该值。它不会传播回调用者。
你在第二个例子中所做的是使这项工作成功的唯一方法。没有办法做你在C中要求的东西。但是,C ++有一个类似的特征:参考参数。