我觉得这是一个非常愚蠢的问题,但我似乎无法在任何地方找到答案!
是否可以从char数组中获取一组字符?抛弃一些伪代码:
char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);
输出:
hello
那么,我是否可以从这样的数组中获取一段字符而不进行循环并获取char-by-char或转换为字符串以便我可以使用substr()?
答案 0 :(得分:15)
简而言之,没有。 C风格的“字符串”根本不起作用。您将需要使用手动循环或strncpy()
,或通过C ++ std::string
功能执行此操作。鉴于您使用的是C ++,您可以使用C ++字符串完成所有操作!
<强>侧面注意
实际上,对于您的特定示例应用程序,您只需通过printf()
提供的功能即可实现此目的:
printf("%.5s\n", arry);
答案 1 :(得分:15)
您可以使用memcpy
(或strncpy
)来获取子字符串:
memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
part[3] = 0; /* Add terminator */
在代码的另一方面,请注意,如果printf(str)
包含不受信任的输入,则执行str
会导致格式字符串漏洞。
答案 2 :(得分:5)
正如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;
答案 3 :(得分:0)
嗯,你确实提到了两种明显的方法。我唯一能想到的就是定义你自己的子串类型来处理字符数组:
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_);
}
};