获取char数组的一部分

时间:2011-01-23 23:12:32

标签: c++ arrays char

我觉得这是一个非常愚蠢的问题,但我似乎无法在任何地方找到答案!

是否可以从char数组中获取一组字符?抛弃一些伪代码:

char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);

输出:

hello

那么,我是否可以从这样的数组中获取一段字符而不进行循环并获取char-by-char或转换为字符串以便我可以使用substr()?

4 个答案:

答案 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_);
    }
};