将迭代字符串与单字符字符串进行比较
Posted
技术标签:
【中文标题】将迭代字符串与单字符字符串进行比较【英文标题】:Comparing iterated string to single-char string 【发布时间】:2021-02-12 22:03:13 【问题描述】:我正在尝试为我的大学课程制作一个简单的程序,该程序应该根据字符串中的分隔符(分隔符)将给定的字符串(目标)拆分为字符串向量。我目前正在尝试遍历目标变量并查找字符串中的特定字符是否等于分隔符字符串中的字符。我知道首先将 delimiter 变量更改为 char 会更容易,但我的教授希望 delimiter 变量是一个字符串,我不知道为什么。我不断收到此错误:
main.cpp:18:21: error: no match for ‘operator==’(操作数类型是 ‘char’ 和 ‘std::string aka std::basic_string’)
这是我目前所拥有的:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector <string> split(string target, string delimiter)
vector <string> splitString;
splitString.reserve(target.length());
for(int i=0; i<target.length(); i++)
if(target[i] == delimiter) //problem originates from this line
continue;
else
splitString[i] += target[i];
return splitString;
int main()
vector <string> displayString;
displayString = split("10,20,30", ",");
for(int i=0; i<displayString.size(); i++)
cout << displayString[i] << " ";
我们将不胜感激。
【问题讨论】:
没有operator defined这样的,编译器是对的。你有什么问题?std::string::find
会更简单
target[i]
是一个字符。一个孤独的char
。如果您需要与作为字符串的分隔符进行比较,则还必须遍历分隔符字符串。众所周知,分隔符中会有多个字符。尝试多个循环。外部循环通过 target
一个字符一个字符地工作。内部循环通过target
和delimiter
工作。如果内部循环找到完全匹配,则将分隔符前面的标记存储在vector
中。如果不是,则将外循环前进一并从外点重新开始内循环。
注意:上面的速度不是特别快,但很简单,可以帮助您入门。
您希望target[i] == delimiter
做什么?左边是一个字符;在右边一个字符串。您可以比较两个字符串。您可以比较两个字符。将单个字符与整个字符串进行比较意味着什么?为什么你从target
中选择了一个字符,而不是从delimiter
中选择了一个?
【参考方案1】:
问题
比较 string
和 char
。 Asker 自己解决了这个问题。
splitString.reserve(target.length());
保留存储空间,但不对其进行任何操作。它只是分配空间。这意味着
splitString[i] += target[i];
写入尚未初始化的字符串。这很可能是报告的崩溃。应该用过
splitString.resize(target.length());
resize
获取空间并对其进行初始化。但是......一旦你解决了下一个问题,可能空间太大了。
splitString[i] += target[i];
在i
上的循环内有效地将target
中的字符一一复制到splitString
中的string
s 中。您希望在分隔符之间累积该字符并将累积存储在splitString
。
解决方案
vector<string> split(string target, string delimiter)
vector<string> splitString;
string acumulator;
for (size_t i = 0; i < target.length(); i++)
if (target[i] == delimiter[0]) // please check this with the
// instructor. They are crafty.
// there could be some subtext
// you have missed
splitString.push_back(acumulator); // store accumulation
acumulator = ""; // restart accumulating
else
acumulator += target[i]; // accumulate
splitString.push_back(acumulator); // store whatever is left
return splitString;
【讨论】:
以上是关于将迭代字符串与单字符字符串进行比较的主要内容,如果未能解决你的问题,请参考以下文章