获取字符数组的一部分
Posted
技术标签:
【中文标题】获取字符数组的一部分【英文标题】:Get part of a char array 【发布时间】:2011-06-14 05:09:24 【问题描述】:我觉得这是一个非常愚蠢的问题,但我似乎无法在任何地方找到答案!
是否可以从一个字符数组中获取一组字符?扔掉一些伪代码:
char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);
输出:
hello
那么,我可以从这样的数组中获取一段字符,而无需循环并逐个字符地获取它们或转换为字符串,以便我可以使用 substr() 吗?
【问题讨论】:
【参考方案1】:简而言之,没有。 C 风格的“字符串”根本不能那样工作。您要么必须使用手动循环,要么使用strncpy()
,或者通过 C++ std::string
功能来实现。既然你在 C++ 中,你也可以用 C++ 字符串来做任何事情!
旁注
碰巧,对于您的特定示例应用程序,您可以通过printf()
提供的功能简单地实现这一点:
printf("%.5s\n", arry);
【讨论】:
好吧,那太糟糕了。哦,好吧,我可以转换为字符串,我只是想知道是否有更...优雅的解决方案。我正在修剪 char 数组的一部分以供以后使用,因此仅使用 printf 的能力并不能解决它。但无论如何,谢谢你的花絮,我不知道,它可能会派上用场! @Curlystraw:@Moo-Juice 的回答使用 C++ 字符串,如果你问我,它非常优雅!【参考方案2】:您可以使用memcpy
(或strncpy
)来获取子字符串:
memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
part[3] = 0; /* Add terminator */
在代码的另一个方面,请注意,如果 str
包含不受信任的输入,则执行 printf(str)
可能会导致格式字符串漏洞。
【讨论】:
【参考方案3】:正如 Oli 所说,您需要使用 C++ std::string
功能。在您的示例中:
std::string hello("Hello World!");
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4'
std::cout << part;
【讨论】:
【参考方案4】:嗯,您确实提到了两种明显的方法。我唯一能想到的就是定义自己的子字符串类型来处理字符数组:
struct SubArray
SubArray(const char* a, unsigned s, unsigned e)
:arrayOwnedElseWhere_(a),
start_(s),
end_(e)
const char* arrayOwnedElseWhere_;
unsigned start_;
unsigned end_;
void print()
printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_);
;
【讨论】:
以上是关于获取字符数组的一部分的主要内容,如果未能解决你的问题,请参考以下文章