gpt4 book ai didi

c - va_list 和 char* 字符串

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:23 25 4
gpt4 key购买 nike

[编辑] 在样本中插入 NULL 终止

我有一个函数接收以 NULL 结尾的 va_list。我将每个字符串连接到一个名为 joinedStringchar* 中。函数按预期工作,除了每次调用此函数时我的 joinedString 都会增加其大小。我的意思是保留前一个字符串并加入新字符串。

例子:第一次调用:

ShowMsg(style1, "a", "s", "d", NULL);

产生的结果:“asd”

第二次通话:

ShowMsg(style1, "w", "w", "q", NULL);

产生的结果:“asdwwq”

这种行为很奇怪,因为每次调用此函数时,joinedString 都会被初始化。 va_list 是否保存以前使用的值?我使用的是 C,而不是 C++,而且我知道,使用 std::string 会容易得多。

int ShowMsg(MSGBOXSTYLE msgStyle, char* str, ...)
{
char* title = "", *joinedString = "", *theArg = "";
wchar_t* convertedTitle = "", *convertedString = "";

va_list args;
theArg = str;
va_start( args, str );
while(theArg != NULL)
{
if(msgStyle == WARN)
{
title = theArg;
}
else
{
strcat( joinedString, theArg );
strcat( joinedString, "\n\r" );
}
theArg = va_arg(args, char*);
}
va_end(args);
...
convertedTitle = (wchar_t*)malloc((strlen(title)+1)*sizeof(wchar_t));
convertedString = (wchar_t*)malloc((strlen(joinedString)+1)*sizeof(wchar_t));
mbstowcs( convertedTitle, title, strlen(title)+1 );
mbstowcs( convertedString, joinedString, strlen(joinedString)+1 );
...
free(convertedTitle);
free(convertedString);
}

最佳答案

那是因为你不能像那样初始化字符串。您的初始化程序 char* joinedString = "" 正在初始化指针 joinedString 以指向特定的内存地址,该地址在您的程序开头由一个空字符串组成。

然后,在您第一次调用该函数时,joinedString 被设置为指向那个仍然是空的内存区域。然后将一些字符放在那里并退出。

下次开始时,字符仍然存在。您唯一初始化的是指针,而不是实际数据。 strcat 然后将您的新参数附加到已填充字符串的末尾!

这应该是段错误,实际上我对您的程序正在输出任何内容印象深刻。它之所以有效,可能只是因为您只使用了几个字节,所以您没有覆盖太多。

要修复它,使用 malloc 初始化 joinedString:

char* joinedString = malloc(MAX_LENGTH * sizeof(*joinedString));
joinedString[0] = '\0'; // Initialize to an empty string

然后在函数结束时,释放内存

free(joinedString);

关于c - va_list 和 char* 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com