gpt4 book ai didi

c++ - 从另一个函数获取 char[] 的方法很好。开始用 c/c++ 思考

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:35 24 4
gpt4 key购买 nike

据我了解,正确的编程风格告诉我们,如果您想从另一个函数获取字符串 (char []),最好由调用者创建 char * 并将其与创建的字符串长度一起传递给字符串格式化函数。在我的例子中,字符串格式化函数是“getss”。

void getss(char *ss, int& l)
{

sprintf (ss,"aaaaaaaaaa%d",1);
l=11;
}


int _tmain(int argc, _TCHAR* argv[])
{

char *f = new char [1];
int l =0;
getss(f,l);

cout<<f;
char d[50] ;
cin>> d;
return 0;
}

"getss"格式化字符串并将其返回给 ss*。我认为 getss 不允许获得调用者创建的外部字符串长度。根据我的理解,调用者通过变量“l”告诉长度,“getcc”返回长度以防缓冲区未完全填充,但不允许超出调用者定义的数组范围。

但现实告诉我,调用者创建的缓冲区大小并不那么重要。没关系,如果你创建大小为 1,并且 gets 填充 11 个字符长。在输出中,我将获得“getss”已填充的所有字符。

那么传递长度变量的原因是什么——你总是会得到以零结尾的字符串,你会根据它找到结尾。

如果gets可以扩展它,为什么要创建指定长度的缓冲区?

它在现实世界中是如何完成的 - 从另一个函数获取字符串?

最佳答案

实际上,调用者已经分配了缓冲区并且知道可以放入其中的字符串的最大大小。它将那个大小传递给函数,函数必须使用它来避免传递的缓冲区溢出。

在您的示例中,这意味着调用 snprintf()而不是 sprintf():

void getss(char *ss, int& l)
{
l = snprintf(ss, l, "aaaaaaaaaa%d", 1);
}

当然,在 C++ 中,您只需返回一个 std::string 的实例。 ,所以这主要是 C 范例。由于 C 不支持引用,该函数通常返回字符串的长度:

int getss(char *buffer, size_t bufsize)
{
return snprintf(buffer, bufsize, "aaaaaaaaaa%d", 1);
}

关于c++ - 从另一个函数获取 char[] 的方法很好。开始用 c/c++ 思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11577519/

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