获取字符数组的一部分

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

【讨论】:

以上是关于获取字符数组的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在Node.js中提取部分字符串和字符串数组?

直接查找子字符串是不是是列表/数组的一部分

C++:在转换为 int 并添加时为我的字符数组获取奇怪的值

基于AJAX获取数据/JSON字符串转换为对象

Java怎么截取字符数组的一部分

C++ atoi 获取在程序同一部分创建的其他字符的值