假设我有一个包含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);那没用。
答案 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;
});