在空格

时间:2017-05-19 03:52:36

标签: c++ string

我正在尝试将带有空格的单个字符串拆分为三个单独的字符串。例如,我有一个字符串(str1)。用户输入任何3个单词,如 "Hey it's me""It's hot out"。 从那里,我需要编写一个函数,它将获取此字符串(str1)并将其分为三个不同的字符串。那么(以第一个例子为例)它会说:

Hey (is the first part of the string)
it's (is the second part of the string)
me (is the third part of the string)

我在使用哪种操作来分隔空格中的字符串时遇到了困难。

这是我到目前为止的代码,这就是用户输入输入的方式。我正在寻找使用istringstream完成此 WITHOUT 的最基本方法!仅使用基本的字符串操作,例如find(),substr()。

**我希望创建一个单独的函数来执行字符串分解**我想出了如何使用此代码获取输入的第一部分:

cout << "Enter a string" << endl;
getline(cin, one);

position = str1.find(' ', position);
first_section = str1.substr(0, position);

但是现在我不知道如何将字符串的第二部分或第三部分分成他们自己的字符串。我在想一个for循环可能吗?不确定。

#include <iostream>
#include <string>
using namespace std;

int main() {
   string str1;
   cout << "Enter three words: ";
   getline(cin, str1);
   while(cin) {
        cout << "Original string: " << str1 << endl;
        cin >> str1;
   }

   return;
}

3 个答案:

答案 0 :(得分:0)

  

我在使用哪种操作来分隔空格处的字符串时遇到了困难。

  1. 使用std::istringstream中的str1
  2. std::istringstream
  3. 中读取每个令牌
    // No need to use a while loop unless you wish to do the same
    // thing for multiple lines.
    // while(cin) {
    
        cout << "Original string: " << str1 << endl;
        std::istringstream stream(str1);
        std::string token1;
        std::string token2;
        std::string token3;
    
        stream >> token1 >> token2 >> token3;
    
        // Use the tokens anyway you wish
    // }
    

    如果您希望对多行输入执行相同操作,请使用:

    int main() {
       string str1;
       cout << "Enter three words: ";
       while(getline(cin, str1))
       {
          cout << "Original string: " << str1 << endl;
          std::istringstream stream(str1);
          std::string token1;
          std::string token2;
          std::string token3;
    
          stream >> token1 >> token2 >> token3;
    
          // Use the tokens anyway you wish
    
          // Prompt the user for another line
          cout << "Enter three words: ";
       }
    }
    

答案 1 :(得分:0)

也许最基本的解决方案是使用位于循环内的读取单个单词。例如:

cin >> word1;       // extracts the first word
cin >> word2;       // extracts the second word
getline(cin, line); // extracts the rest of the line

您可以使用这些表达式的结果返回值来检查成功:

#include <string>
#include <iostream>

int main(void) {
    std::string word1, word2, line;
    int success = std::cin >> word1 && std::cin >> word2
                                    && !!std::getline(std::cin, line); // double-! necessary?
    if (success) { std::cout << "GOOD NEWS!"  << std::endl; }
    else         { std::cout << "bad news :(" << std::endl; }
    return 0;
}

或者,在这样的字符串中,我希望有两个空格。我的建议是使用string::find来定位第一个和第二个空格,如下所示:

size_t first_position  = str1.find(' ', 0);

您应该以{{1​​}}对此进行检查,以此作为处理错误的机会。接下来:

string::npos

接下来的错误处理检查,之后,使用string::substr将该字符串拆分为如下部分应该是微不足道的:

size_t second_position = str1.find(' ', first_position + 1);

答案 2 :(得分:0)

我有这个Utility类,它有一堆字符串操作方法。我将展示用于使用分隔符拆分字符串的类函数。此类具有私有构造函数,因此您无法创建此类的实例。所有方法都是静态方法。

<强> Utility.h

#ifndef UTILITY_H
#define UTILITY_h

// Library Includes Here: vector, string etc.

class Utility {
public:
    static std::vector<std::string> splitString( const std::string& strStringToSplit,
                                                 const std::string& strDelimiter,
                                                 const bool keepEmpty = true );

private:
    Utility();
};

<强> Utility.cpp

std::vector<std::string> Utility::splitString( const std::string& strStringToSplit, 
                                               const std::string& strDelimiter, 
                                               const bool keepEmpty ) {
    std::vector<std::string> vResult;
    if ( strDelimiter.empty() ) {
        vResult.push_back( strStringToSplit );
        return vResult;
    }

    std::string::const_iterator itSubStrStart = strStringToSplit.begin(), itSubStrEnd;
    while ( true ) {
        itSubStrEnd = search( itSubStrStart, strStringToSplit.end(), strDelimiter.begin(), strDelimiter.end() );
        std::string strTemp( itSubStrStart, itSubStrEnd );
        if ( keepEmpty || !strTemp.empty() ) {
            vResult.push_back( strTemp );
        }

        if ( itSubStrEnd == strStringToSplit.end() ) {
            break;
        }

        itSubStrStart = itSubStrEnd + strDelimiter.size();
    }

    return vResult;    
} 

Main.cpp - 用法

#include <string>
#include <vector>
#include "Utility.h"

int main() {
    std::string myString( "Hello World How Are You Today" );

    std::vector<std::string> vStrings = Utility::splitString( myString, " " );

    // Check Vector Of Strings
    for ( unsigned n = 0; n < vStrings.size(); ++n ) {
        std::cout << vStrings[n] << " ";
    }
    std::cout << std::endl;

    // The Delimiter is also not restricted to just a single character
    std::string myString2( "Hello, World, How, Are, You, Today" );

    // Clear Out Vector
    vStrings.clear();

    vStrings = Utility::splitString( myString2, ", " ); // Delimiter = Comma & Space

    // Test Vector Again
    for ( unsigned n = 0; n < vStrings.size(); ++n ) {
        std::cout << vStrings[n] << " ";
    }
    std::cout << std::endl;

    return 0;
}