如何截断字符串数组? C ++

时间:2018-01-30 15:33:07

标签: c++ arrays string

假设我有一个包含5个单词的字符串数组,我只想输出每个单词的前3个字母。我该如何继续这样做?我知道怎么用一个字符串来做,但是有一个字符串数组我迷路了。

这是如何使用一个字符串

std::string test = "hello";

std::cout << test << std::endl;

test = test.substr(0,3);

std::cout << test << std::endl;

我想做的是这个

std::string test[5] = {"hello", "pumpkin", "friday", "snowboard", "snacks"};

我想宣传每个单词的前3个字母。我试过test [5] = test [5] .substr(0,3);那没用。

5 个答案:

答案 0 :(得分:4)

test [5]不起作用,因为你的数组中只有5个项目,只有索引0到4有效。

通常使用数组,您需要编写一个循环来依次遍历每个数组项,例如

for (int i = 0; i < 5; ++i)
    test[i] = test[i].substr(0,3);

for (int i = 0; i < 5; ++i)
    cout << test[i] << endl;

答案 1 :(得分:3)

使用test[5],您正在读取界限,从而调用undefined behavior。 C ++中的数组是零索引的,因此最后一个元素是test[4]。创建一个利用例如std::next函数或字符串substr成员函数的函数。在range based loop内打电话:

#include <iostream>
#include <string>
void foo(const std::string& s) {
    if (s.size() >= 3) {
        std::cout << std::string(s.begin(), std::next(s.begin(), 3)) << '\n';
        // or simply:
        std::cout << s.substr(0, 3) << '\n';
    }
}
int main() {
    std::string test[5] = { "hello", "pumpkin", "friday", "snowboard", "snacks" };
    for (const auto& el : test) {
        foo(el);
    }
}

答案 2 :(得分:0)

 test[5] = test[5].substr(0,3); won't work  and more over you don't have `test[5]`, index starts from `0`.

你可能想这样做

for(int i=0 ; i<5; i++) {
                test[i] = test[i].substr(0,3);
                cout << test[i] << endl;
        }

答案 3 :(得分:0)

substr正是您要找的。这是我的实施。

#include <array>
#include <string>
#include <iostream>
int main () {
    std::array<std::string,5> list {"hello", "pumpkin", "friday", "snowboard", "snacks"};

    for (const auto &word : list){
        std::cout << word << std::endl;
    }

    for (auto &word : list){
        word = word.substr(0,3);
    }

    for (const auto &word : list){
        std::cout << word << std::endl;
    }
}

答案 4 :(得分:0)

使用标准库。

std::for_each(std::begin(test), std::end(test), [] (auto& s) { s.erase(3); });

甚至是一个简单的基于范围的for循环:

for (auto&& s : test) {
    s.erase(3); // Erase from index 3 to end of string.
}

或者甚至可能创建另一个包含原始字符串视图的容器:

auto test2 = std::accumulate(std::begin(test), std::end(test),
                             std::vector<std::string_view>{},
                             [] (auto& prev, std::string_view sv) -> decltype(prev)& {
    prev.push_back(sv.substr(0, 3));
    return prev;
});