如何切割字符串C++

How to Cut String C++

本文关键字:C++ 字符串 何切割      更新时间:2023-10-16

您好,我想在这种情况下切断字符串:

if (std::count(text.begin(), text.end(), ',') > 3 {
//Cut String after 3 ',' 
}

文本如下所示:

"项目 1、项目 2、项目 3、项目4、项目5">

我想要这个:

"项目1,项目2,项目3,项目4[在右侧>>上剪切所有内容],项目5" 并返回 "项目 1、项目 2、项目3、项目4">

寻找第一个答案,我正在寻找这样的东西(但有效(:

#include <string.h> 
#include <iostream> 
using namespace std; 
int main() 
{ 
string s1 = "item1, item2, item3, item4, item5"; 
if(std::count(s1.begin(), s1.end(), ',') > 3) {
int comma = 0;
int x = sizeof(s1);
for(int i = 0; i < x; i++) {
if (comma == 3) {
string sub = s1.substr(0, i); 
cout << "String is: " << sub; 
}
if(s1[i] == ',') {
comma++;
}
}
}
return 0; 
} 

看看 std::string::substr

#include <string.h> 
#include <iostream> 
using namespace std; 
int main() 
{ 
// Take any string 
string s1 = "item1, item2, item3, item4, item5"; 
// Start at position 0 to position of character ',' in "item4," 
string sub = s1.substr(0, 26); 
// prints item1, item2, item3, item4
cout << "String is: " << sub; 
return 0; 
} 

您需要更改如下代码。

#include <string.h> 
#include <iostream>
using namespace std; 
int main() 
{ 
string s1 = "item1, item2, item3, item4, item5"; 
int comma = 0;
int x = s1.length();
bool flag = false;
for(int i = 0; i < x; i++) {
if (comma == 4) {
string sub = s1.substr(0, i-1); 
cout << "String is: " << sub;
flag = false;
return 0;
}
if(s1[i] == ',') {
comma++;
}
else{
flag = true;
}
}
if(flag)
cout<<"String not contain more then 3 comma's n String is :: "<<s1;
return 0; 
}
#include <string>
#include <algorithm>
#include <iostream> 
using namespace std; 
int main() 
{ 
string s1 = "item1, item2, item3, item4, item5"; 
if(std::count(s1.begin(), s1.end(), ',') > 3) {
int comma = 0;
int x = s1.length();
for(int i = 0; i < x; i++) {
if (comma == 3) {
string sub = s1.substr(0, i-1); 
cout << "String is: " << sub;
return sub; 
}
if(s1[i] == ',') {
comma++;
}
}
}
return 0; 
} 

没有必要使用std::count(),那只是浪费了开销。您扫描字符串两次,而一次就足够了。

此外,您对sizeof()的使用是错误的,您需要改用std::string::size()sizeof(s1)告诉您编译时s1(即std::string类本身(的字节大小,而s1.size()告诉您运行时s1中有多少个字符。

我建议在循环中使用std::string::find(),例如:

#include <string>
#include <iostream>
std::string cutAtNComma(const std::string &s, int n) {
std::string::size_type idx = 0;
while (n-- > 0) {
idx = s.find(',', idx);
if (idx == std::string::npos) break;
if (n == 0) return s.substr(0, idx);
++idx;
}
return s;
}
int main() {
std::string s1 = "item1, item2, item3, item4, item5";
std::string sub = cutAtNComma(s1, 4);
std::cout << "String is: " << sub;
return 0;
}

现场演示

或者,您可以改用std::find_if(),例如:

#include <string>
#include <iostream>
#include <algorithm>
std::string cutAtNComma(const std::string &s, int n) {
auto iter = std::find_if(s.cbegin(), s.cend(),
[n](char c) mutable {
if (c == ',') {
if (--n == 0) return true;
}
return false;
}
);
if (iter != s.cend()) return std::string(s.cbegin(), iter);
return s;
}
int main() {
std::string s1 = "item1, item2, item3, item4, item5";
std::string sub = cutAtNComma(s1, 4);
std::cout << "String is: " << sub;
return 0;
}

现场演示