获取字符数组的一部分

17

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

从字符数组中获取一组字符是否可能?举个伪代码的例子:

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

输出:

hello

那么,我能否从这样的数组中获取一段字符而不用遍历并逐个获取它们或者将它们转换为字符串以便使用substr()函数?

4个回答

24

您可以使用memcpy(或strncpy)来获取子字符串:

memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
part[3] = 0; /* Add terminator */

另外需要注意的是你的代码,当使用printf(str)时,如果str包含不受信任的输入,可能会导致格式化字符串漏洞。


19
简而言之,不行。C语言风格的“字符串”就是不能这样工作的。你必须要使用手动循环、strncpy()或者通过C++ std::string功能来完成。既然你在使用C++,那么最好就直接使用C++中的字符串吧! 附注 恰好对于你的特定应用场景,你可以使用printf()提供的功能来实现这一点:
printf("%.5s\n", arry);

好吧,那太糟糕了。噢,没关系,我可以转换为字符串,只是想知道是否有更...优雅的解决方案。 而且我正在从字符数组中削减一部分以后使用,所以仅使用printf的能力无法解决它。但还是谢谢你提供的提示,我不知道这个,可能会派上用场! - Curlystraw
@Curlystraw:下面@Moo-Juice的答案使用了C++字符串,如果你问我,这相当漂亮! - Oliver Charlesworth

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;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接