鱼C论坛

 找回密码
 立即注册
查看: 2204|回复: 19

[已解决]C++分割函数

[复制链接]
发表于 2023-2-16 20:42:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是我自己写的一个分割 string 类型的函数,现在在编译期不会出现问题,但是运行时会出问题,请问是什么原因,该怎么改
  1. vector<string> split(string x, char fenge = ' ') {
  2.         vector<string> ans;
  3.        
  4.         for(int i=0; i<x.length(); ++i) {
  5.                 /*cout << "i:" << i << endl;
  6.                 cout << "ans: ";
  7.                 for(int j=0; j<ans.size(); ++j) {
  8.                         cout << ans[j] << " ";
  9.                 }
  10.                 cout << endl;
  11.                 */
  12.                 if(i == 0 || char(x[i]) == fenge) {
  13.                         ans.push_back(string());
  14.                         if(ans.size() > 1 && ans[ans.size()-2] == string()) {
  15.                                 ans.erase(ans.begin() + ans.size()-2);
  16.                         }
  17.                 }
  18.                 else {
  19.                         if(('a' <= x[i] <= 'z' || 'A' <= x[i] <= 'Z')) {
  20.                                 int s = ans.size()-1;
  21.                                 ans[s].insert(s, (const char *)x[i]);
  22.                                 // cout << "ans[s]:" << ans[s] << endl;
  23.                         }
  24.                 }
  25.         }
  26.        
  27.         return ans;
  28. }
复制代码
最佳答案
2023-2-16 22:32:05
  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. using namespace std;

  5. string SPLIT(string str, char c, int i = 1) {
  6.         vector <string> results;
  7.         istringstream temp(str);
  8.         string token;
  9.         while (getline(temp, token, c)) { results.push_back(token); }
  10.         return results[i - 1];
  11. }

  12. int main(void) {
  13.         cout << SPLIT("haha/fafa/dada/rara", '/', 2) << endl;
  14.         return 0;
  15. }
复制代码
  1. fafa
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-16 21:03:05 | 显示全部楼层
编译器首先很不满意
  1. warning: cast to 'const char *' from smaller integer type 'std::basic_string<char>::value_type'
  2.       (aka 'char') [-Wint-to-pointer-cast]
  3.                                 ans[s].insert(s, (const char *)x[i]);
  4.                                                  ^~~~~~~~~~~~~~~~~~
  5. warning: comparison of integers of different signs: 'int' and 'std::basic_string<char>::size_type'
  6.       (aka 'unsigned long long') [-Wsign-compare]
  7.         for(int i=0; i<x.length(); ++i) {
  8.                      ~^~~~~~~~~~~
  9. warning: result of comparison of constant 90 with expression of type 'bool' is always true
  10.       [-Wtautological-constant-out-of-range-compare]
  11.                         if(('a' <= x[i] <= 'z' || 'A' <= x[i] <= 'Z')) {
  12.                                                   ~~~~~~~~~~~ ^  ~~~
  13. warning: result of comparison of constant 122 with expression of type 'bool' is always true
  14.       [-Wtautological-constant-out-of-range-compare]
  15.                         if(('a' <= x[i] <= 'z' || 'A' <= x[i] <= 'Z')) {
  16.                             ~~~~~~~~~~~ ^  ~~~
  17. 4 warnings generated.
复制代码

然后我总觉得自己不是在读 C++ 代码而是一种别的语言,感觉很陌生,看不懂思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 21:29:44 | 显示全部楼层
写一写注释,说一说这个代码的实现思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-16 21:41:55 | 显示全部楼层
dolly_yos2 发表于 2023-2-16 21:03
编译器首先很不满意

然后我总觉得自己不是在读 C++ 代码而是一种别的语言,感觉很陌生,看不懂思路

为什么我的Dev-c++只有一个Warning
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-16 21:44:15 | 显示全部楼层
本帖最后由 tommyyu 于 2023-2-16 21:46 编辑
人造人 发表于 2023-2-16 21:29
写一写注释,说一说这个代码的实现思路

  1. vector<string> split(string x, char fenge = ' ') {
  2.         vector<string> ans;
  3.        
  4.         for(int i=0; i<(int)x.length(); ++i) {
  5.                 /*cout << "i:" << i << endl;
  6.                 cout << "ans: ";
  7.                 for(int j=0; j<ans.size(); ++j) {
  8.                         cout << ans[j] << " ";
  9.                 }
  10.                 cout << endl;
  11.                 */
  12.                
  13.                 if(x.c_str()[i] == fenge) {      //如果遇到要分割的字符,则在返回的列表中增加一个空字符串
  14.                         if(i == 0 || char(x[i-1]) != fenge)
  15.                                 ans.push_back(string());
  16.                 }
  17.                 else {                           //如果不是要分割的字符
  18.                         if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z')) { // 如果是字母
  19.                                 int s = ans.size()-1;                        //添加到返回的列表中的最后一个字符串中
  20.                                 ans[s].insert(s, (const char *)x.c_str()[i]);
  21.                                 // cout << "ans[s]:" << ans[s] << endl;
  22.                         }
  23.                 }
  24.         }
  25.        
  26.         return ans;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-16 21:45:56 | 显示全部楼层
dolly_yos2 发表于 2023-2-16 21:03
编译器首先很不满意

然后我总觉得自己不是在读 C++ 代码而是一种别的语言,感觉很陌生,看不懂思路

又改了一下
  1. vector<string> split(string x, char fenge = ' ') {
  2.         vector<string> ans;
  3.        
  4.         for(int i=0; i<(int)x.length(); ++i) {
  5.                 /*cout << "i:" << i << endl;
  6.                 cout << "ans: ";
  7.                 for(int j=0; j<ans.size(); ++j) {
  8.                         cout << ans[j] << " ";
  9.                 }
  10.                 cout << endl;
  11.                 */
  12.                
  13.                 if(x.c_str()[i] == fenge) {      //如果遇到要分割的字符,则在返回的列表中增加一个空字符串
  14.                         if(i == 0 || char(x[i-1]) != fenge)
  15.                                 ans.push_back(string());
  16.                 }
  17.                 else {                           //如果不是要分割的字符
  18.                         if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z')) { // 如果是字母
  19.                                 int s = ans.size()-1;                        //添加到返回的列表中的最后一个字符串中
  20.                                 ans[s].insert(s, (const char *)x.c_str()[i]);
  21.                                 // cout << "ans[s]:" << ans[s] << endl;
  22.                         }
  23.                 }
  24.         }
  25.        
  26.         return ans;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 21:54:07 | 显示全部楼层

这个 insert 就极为别扭,里面的类型转换确定没问题吗?
看看 std::string::push_back 能不能用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 21:56:11 | 显示全部楼层

我也看不懂你在做什么
说一说这个代码的实现思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-16 21:57:39 | 显示全部楼层
dolly_yos2 发表于 2023-2-16 21:54
这个 insert 就极为别扭,里面的类型转换确定没问题吗?
看看 std::string::push_back 能不能用
  1. vector<string> split(string x, char fenge = ' ') {
  2.         vector<string> ans;
  3.        
  4.         for(int i=0; i<(int)x.length(); ++i) {
  5.                 /*cout << "i:" << i << endl;
  6.                 cout << "ans: ";
  7.                 for(int j=0; j<ans.size(); ++j) {
  8.                         cout << ans[j] << " ";
  9.                 }
  10.                 cout << endl;
  11.                 */
  12.                
  13.                 if(x.c_str()[i] == fenge) {      //如果遇到要分割的字符,则在返回的列表中增加一个空字符串
  14.                         if(i == 0 || char(x[i-1]) != fenge)
  15.                                 ans.push_back(string());
  16.                 }
  17.                 else {                           //如果不是要分割的字符
  18.                         if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z')) { // 如果是字母
  19.                                 int s = ans.size()-1;                        //添加到返回的列表中的最后一个字符串中
  20.                                 ans[s].push_back(x.c_str()[i]);
  21.                                 // cout << "ans[s]:" << ans[s] << endl;
  22.                         }
  23.                 }
  24.         }
  25.        
  26.         return ans;
  27. }
复制代码

现在运行完的结果还是

  1. --------------------------------
  2. Process exited after 3.907 seconds with return value 3221225477
  3. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-16 22:00:43 | 显示全部楼层
人造人 发表于 2023-2-16 21:56
我也看不懂你在做什么
说一说这个代码的实现思路

遍历字符串中的每一个字符
判断当前字符是不是分隔符
    如果是,添加一个新的字符串,但是如果自己的上一个字符也是分隔符的话,就不添加新字符串
    如果不是,
        如果是一个字母的话,就在列表中的最后一个字符串的最后加入这个字符。
        如果不是字母,就不进行操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 22:01:24 | 显示全部楼层
tommyyu 发表于 2023-2-16 22:00
遍历字符串中的每一个字符
判断当前字符是不是分隔符
    如果是,添加一个新的字符串,但是如果自己 ...
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>

  4. std::vector<std::string> split(const std::string &x, char fenge = ' ') {
  5.     std::vector<std::string> ans;
  6.     //for(int i = 0; i < (int)x.length(); ++i) {
  7.     for(size_t i = 0; i < x.length(); ++i) {
  8.         if(x.c_str()[i] == fenge) {     // 如果遇到要分割的字符,则在返回的列表中增加一个空字符串
  9.             if(i == 0 || char(x[i - 1]) != fenge) ans.push_back(std::string());
  10.         } else {    // 如果不是要分割的字符
  11.             if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z')) { // 如果是字母
  12.                 int s = ans.size() - 1; // 添加到返回的列表中的最后一个字符串中

  13.                 ans[s].insert(s, (const char *)x.c_str()[i]); // 这是什么?
  14.             }
  15.         }
  16.     }
  17.     return ans;
  18. }

  19. std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
  20.     bool flag = false;
  21.     for(const auto &i: v) {
  22.         if(flag)
  23.             os << std::endl;
  24.         flag = true;
  25.         os << i;
  26.     }
  27.     return os;
  28. }

  29. int main() {
  30.     {
  31.         std::vector<std::string> v = split("12345", '.');
  32.         std::cout << v << std::endl;
  33.     }
  34.     std::cout << "**************************" << std::endl;
  35.     std::cout << split(".12345", '.') << std::endl;
  36.     std::cout << "**************************" << std::endl;
  37.     std::cout << split("12.345", '.') << std::endl;
  38.     std::cout << "**************************" << std::endl;
  39.     std::cout << split("12345.", '.') << std::endl;
  40.     std::cout << "**************************" << std::endl;
  41.     std::cout << split(".1.23.45.", '.') << std::endl;
  42.     return 0;
  43. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-16 22:09:13 | 显示全部楼层

将字符加入最后一个字符串中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 22:24:18 | 显示全部楼层
tommyyu 发表于 2023-2-16 22:09
将字符加入最后一个字符串中

你这个思路太复杂了

  1. sh-5.1$ cat main.cpp
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>

  5. std::vector<std::string> split(const std::string &x, char fenge = ' ') {
  6.     //std::vector<std::string> ans;
  7.     std::vector<std::string> ans(1);    // 如果没有分隔符呢?
  8.     for(size_t i = 0; i < x.length(); ++i) {
  9.         //if(x.c_str()[i] == fenge) {
  10.         if(x[i] == fenge) {
  11.             //if(i == 0 || char(x[i - 1]) != fenge) ans.push_back(std::string());   // x[i - 1] 的类型是什么?
  12.             if(i == 0 || x[i - 1] != fenge) ans.push_back(std::string());
  13.         } else {
  14.             if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z')) { // 如果是字母
  15.                 //int s = ans.size() - 1; // 添加到返回的列表中的最后一个字符串中
  16.                 size_t s = ans.size() - 1; // 添加到返回的列表中的最后一个字符串中
  17.                 //ans[s].insert(s, (const char *)x.c_str()[i]); // 这是什么?
  18.                 ans[s].push_back(x[i]);     // 是吧?
  19.             }
  20.         }
  21.     }
  22.     return ans;
  23. }

  24. std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
  25.     bool flag = false;
  26.     for(const auto &i: v) {
  27.         if(flag)
  28.             os << std::endl;
  29.         flag = true;
  30.         os << i;
  31.     }
  32.     return os;
  33. }

  34. int main() {
  35.     std::cout << "**************************" << std::endl;
  36.     std::cout << split("abcdefg", '.') << std::endl;
  37.     std::cout << "**************************" << std::endl;
  38.     std::cout << split(".abcdefg", '.') << std::endl;
  39.     std::cout << "**************************" << std::endl;
  40.     std::cout << split("abcdefg.", '.') << std::endl;
  41.     std::cout << "**************************" << std::endl;
  42.     std::cout << split(".abcdefg.", '.') << std::endl;
  43.     std::cout << "**************************" << std::endl;
  44.     std::cout << split("ab.cde.fg", '.') << std::endl;
  45.     std::cout << "**************************" << std::endl;
  46.     std::cout << split("..ab..cde..fg..", '.') << std::endl;
  47.     return 0;
  48. }
  49. sh-5.1$ ./main
  50. **************************
  51. abcdefg
  52. **************************

  53. abcdefg
  54. **************************
  55. abcdefg

  56. **************************

  57. abcdefg

  58. **************************
  59. ab
  60. cde
  61. fg
  62. **************************

  63. ab
  64. cde
  65. fg

  66. sh-5.1$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 22:29:22 | 显示全部楼层
我感觉还是我这个思路清晰
你那个太多的if else组合,要做到没有遗漏,没有重复,这并不容易
像你的那个if else就没有考虑到没有分隔符的情况
太多的if else就很容易出问题,因为那么多的条件组合起来,你很难考虑到所有情况,很容易遗漏一些情况,就像没有分隔符的情况,你就没有考虑到
所以还是尽量避免太多的if else组合

  1. sh-5.1$ cat main.cpp
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. #include <algorithm>

  6. std::vector<std::string> split(const std::string &str, char sep) {
  7.     std::vector<std::string> result;
  8.     std::string::const_iterator b = str.begin();
  9.     while(1) {
  10.         std::string::const_iterator e = std::find(b, str.end(), sep);
  11.         result.push_back(std::string(b, e));
  12.         if(e == str.end()) break;
  13.         b = e + 1;
  14.     }
  15.     return result;
  16. }

  17. std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
  18.     bool flag = false;
  19.     for(const auto &i: v) {
  20.         if(flag) os << std::endl;
  21.         flag = true;
  22.         os << i;
  23.     }
  24.     return os;
  25. }

  26. int main() {
  27.     {
  28.         std::vector<std::string> v = split("12345", '.');
  29.         std::cout << v << std::endl;
  30.     }
  31.     std::cout << "**************************" << std::endl;
  32.     std::cout << split(".12345", '.') << std::endl;
  33.     std::cout << "**************************" << std::endl;
  34.     std::cout << split("12.345", '.') << std::endl;
  35.     std::cout << "**************************" << std::endl;
  36.     std::cout << split("12345.", '.') << std::endl;
  37.     std::cout << "**************************" << std::endl;
  38.     std::cout << split(".1.23.45.", '.') << std::endl;
  39.     return 0;
  40. }
  41. sh-5.1$ ./main
  42. 12345
  43. **************************

  44. 12345
  45. **************************
  46. 12
  47. 345
  48. **************************
  49. 12345

  50. **************************

  51. 1
  52. 23
  53. 45

  54. sh-5.1$
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 22:32:05 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. using namespace std;

  5. string SPLIT(string str, char c, int i = 1) {
  6.         vector <string> results;
  7.         istringstream temp(str);
  8.         string token;
  9.         while (getline(temp, token, c)) { results.push_back(token); }
  10.         return results[i - 1];
  11. }

  12. int main(void) {
  13.         cout << SPLIT("haha/fafa/dada/rara", '/', 2) << endl;
  14.         return 0;
  15. }
复制代码
  1. fafa
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 22:37:32 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>

  4. std::vector<std::string> split(const std::string &x, char fenge = ' ') {
  5.     //std::vector<std::string> ans;
  6.     std::vector<std::string> ans(1);    // 不对,不是没有分隔符的情况,是第一个字符不是分隔符的情况
  7.                                         // 都说了,太多的if else组合,很难保证没有遗漏掉一些情况
  8.                                         // 你这个思路太复杂了
  9.                                         // 到目前为止,我依然无法保证没有漏掉一些情况
  10.                                         // 除非我把所有能够想到的可能全部枚举出来,然后一个一个去试,看看是不是符合要求
  11.                                         // 这个工作量可不小,我无法在大脑中直接完成这件事
  12.                                         // 而我的那个代码,我就可以在大脑中直接跑出结果
  13.                                         // 我用大脑跑了一遍程序,没有问题,然后又写代码,让计算机去跑一些边界值,然后也没发现问题
  14.     //std::vector<std::string> ans(1);    // 如果没有分隔符呢?
  15.     for(size_t i = 0; i < x.length(); ++i) {
  16.         //if(x.c_str()[i] == fenge) {
  17.         if(x[i] == fenge) {
  18.             //if(i == 0 || char(x[i - 1]) != fenge) ans.push_back(std::string());   // x[i - 1] 的类型是什么?
  19.             if(i == 0 || x[i - 1] != fenge) ans.push_back(std::string());
  20.         } else {
  21.             if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z')) { // 如果是字母
  22.                 //int s = ans.size() - 1; // 添加到返回的列表中的最后一个字符串中
  23.                 size_t s = ans.size() - 1; // 添加到返回的列表中的最后一个字符串中
  24.                 //ans[s].insert(s, (const char *)x.c_str()[i]); // 这是什么?
  25.                 ans[s].push_back(x[i]);     // 是吧?
  26.             }
  27.         }
  28.     }
  29.     return ans;
  30. }

  31. std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
  32.     bool flag = false;
  33.     for(const auto &i: v) {
  34.         if(flag)
  35.             os << std::endl;
  36.         flag = true;
  37.         os << i;
  38.     }
  39.     return os;
  40. }

  41. int main() {
  42.     std::cout << "**************************" << std::endl;
  43.     std::cout << split(".abcdefg", '.') << std::endl;
  44.     std::cout << "**************************" << std::endl;
  45.     std::cout << split("abcdefg.", '.') << std::endl;
  46.     std::cout << "**************************" << std::endl;
  47.     std::cout << split(".abcdefg.", '.') << std::endl;
  48.     std::cout << "**************************" << std::endl;
  49.     std::cout << split("ab.cde.fg", '.') << std::endl;
  50.     std::cout << "**************************" << std::endl;
  51.     std::cout << split("..ab..cde..fg..", '.') << std::endl;
  52.     return 0;
  53. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 23:21:39 | 显示全部楼层
  1. 没看懂。。。。。
  2. vector<string> ans;    //这是一个容器嵌套,ans内的每个值都是一个string

  3. if(i == 0 || char(x[i]) == fenge) {   //这里是想写  i == 0 || (char)(x[i]) == fenge 么? 可能更好的写法是 i== 0 || x.at(i) == fenge
  4.                         ans.push_back(string());     //放进去一个空串?
  5.                         if(ans.size() > 1 && ans[ans.size()-2] == string()) {   //这行没看懂
  6.                                 ans.erase(ans.begin() + ans.size()-2);
  7.                         }
  8. }
复制代码

  1. 没有测试,楼主自己再完善一下吧
  2.         vector<string> ans;
  3.         ans.push_back("");
  4.         for(int i = 0; i < x.size(); ++i){
  5.                 if(x.at(i) == fenge){
  6.                         if(x.at(i + 1) == fenge){ //丢掉连续的
  7.                                 continue;
  8.                         }else{
  9.                                 ans.push_back("");       
  10.                         }
  11.                        
  12.                 }else{
  13.                         ans[ans.size() - 1].append(1, x.at(i));
  14.                 }
  15.         }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-17 16:36:54 | 显示全部楼层
本帖最后由 jhq999 于 2023-2-17 16:45 编辑

//纯分割
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. vector<string> split(string x, char fenge = ' ')
  4. {
  5.     vector<string> ans;
  6.     int i=0,j=0;
  7.     while(x[i])
  8.     {
  9.         if(fenge==x[i])
  10.         {
  11.             if(i&&fenge!=x[i-1])
  12.             {
  13.                 ans.push_back(x.substr(j,i-j));

  14.             }
  15.             j=i+1;
  16.         }
  17.         i+=1;
  18.     }
  19.     if(fenge!=x[i-1])
  20.     {
  21.         ans.push_back(x.substr(j,i-j));

  22.     }
  23.     return ans;
  24. }
复制代码

//只留字母
  1. vector<string> split(string x, char fenge = ' ')
  2. {
  3.     vector<string> ans;
  4.     int i=0,j=0;
  5.     string s="";
  6.     while(x[i])
  7.     {
  8.         if(fenge==x[i])
  9.         {
  10.             if(i&&fenge!=x[i-1])
  11.             {
  12.                 ans.push_back(s);
  13.                 s="";

  14.             }
  15.             j=i+1;
  16.         }
  17.         else if(('a' <= x[i] && x[i] <= 'z') || ('A' <= x[i] && x[i] <= 'Z'))
  18.         {
  19.             s+=x.substr(i,1);
  20.         }
  21.         i+=1;
  22.     }
  23.     if(fenge!=x[i-1])
  24.     {
  25.         ans.push_back(s);

  26.     }
  27.     return ans;
  28. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-17 21:19:40 | 显示全部楼层
人造人 发表于 2023-2-16 22:29
我感觉还是我这个思路清晰
你那个太多的if else组合,要做到没有遗漏,没有重复,这并不容易
像你的那个i ...

看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-17 21:21:12 | 显示全部楼层

看来还是要尽量使用c++的内置函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 18:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表