将迭代字符串与单字符字符串进行比较

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 一个字符一个字符地工作。内部循环通过targetdelimiter 工作。如果内部循环找到完全匹配,则将分隔符前面的标记存储在vector 中。如果不是,则将外循环前进一并从外点重新开始内循环。 注意:上面的速度不是特别快,但很简单,可以帮助您入门。 您希望target[i] == delimiter 做什么?左边是一个字符;在右边一个字符串。您可以比较两个字符串。您可以比较两个字符。将单个字符与整个字符串进行比较意味着什么?为什么你从target 中选择了一个字符,而不是从delimiter 中选择了一个? 【参考方案1】:

问题

比较 stringchar。 Asker 自己解决了这个问题。

splitString.reserve(target.length());

保留存储空间,但不对其进行任何操作。它只是分配空间。这意味着

splitString[i] += target[i];

写入尚未初始化的字符串。这很可能是报告的崩溃。应该用过

splitString.resize(target.length());

resize 获取空间并对其进行初始化。但是......一旦你解决了下一个问题,可能空间太大了。

splitString[i] += target[i];i 上的循环内有效地将target 中的字符一一复制到splitString 中的strings 中。您希望在分隔符之间累积该字符并将累积存储在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;

【讨论】:

以上是关于将迭代字符串与单字符字符串进行比较的主要内容,如果未能解决你的问题,请参考以下文章

字符比较单字符比较值是否相等

python中CSV写入字符串列表,单行变多个单字符的问题?

我的Python之路:迭代和解析

正则表达式 - 示例

正则表达式 - 示例

脱水缩合