获取字符数组的一部分

问题描述 投票:0回答:5

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

是否可以从字符数组中获取一组字符?扔掉一些伪代码:

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

输出:

hello

那么,我可以从这样的数组中获取一段字符,而不需要循环并逐个字符地获取它们或转换为字符串,以便我可以使用 substr() 吗?

c++ arrays char
5个回答
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);

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

0
投票

从 C++17 开始,您可以使用

std::string_view
来完成此操作:

char arry[20] = "hello world!";
auto part = std::string_view{arry, 5};
std::cout << part;

在这里查看:https://coliru.stacked-crooked.com/a/7ca65f2c8e8e46b4


C++20 还包括

std::span
,如果您想处理不仅仅是字符的范围,这是一个选项。

© www.soinside.com 2019 - 2024. All rights reserved.