用连字符“-”标记字符串后,连字符将被删除!!如何在 C++98 中解决这个问题

After tokenizing string with hypen '-', hypen will get eliminated!! how to fix this in c++98

下面 shell 脚本将文件名保存为 add.sh

#!/bin/sh

MY_EXEC="add";

add -Units 32 -raid 111 -log add.log 

我的代码将读取此文件 add.sh 并将内容存储在向量中。 vector[2] 字符串内容 i,e "add -Units 32 -raid 111 -log add.log" 将使用 '-' 进行标记化。 在此之后 o/p 此代码将如下所示。

add
Units 32
raid 111
logFile add.log

低于预期结果的地方,标记化后不应该消除“-”的地方,如何解决这个问题?

add
-Units 32
-raid  111
-logFile add.log

程序代码:

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <cctype>
#include <utility>
  
using namespace std;
/*
 * It will iterate through all the lines in file and
 * put them in given vector
 */
bool getFileContent(string fileName, vector<string> & vecOfStrs)
{
    // Open the File
    ifstream in(fileName.c_str());
    // Check if object is valid
    if(!in)
    {
        cerr << "Cannot open the File : "<<fileName<<endl;
        return false;
    }
    string str;
    // Read the next line from File until it reaches the end.
    while (getline(in, str))
    {
        // Line contains string of length > 0 then save it in vector
        if(str.size() > 0)
            vecOfStrs.push_back(str);
    }
    //Close The File
    in.close();
    return true;
}
int main()
{
    vector<string> vecOfStr;
    vector <string> tokens;
    // Get the contents of file in a vector
    bool result = getFileContent("add.sh", vecOfStr);
    string str = vecOfStr[2].c_str();
    string intermediate;

    // stringstream class check1
    stringstream check1(str);

    // Tokenizing w.r.t. space '-'
    while(getline(check1, intermediate, '-'))
    {
        tokens.push_back(intermediate);
    }

    // Printing the token vector
    for(int i = 0; i < tokens.size(); i++)
        cout << tokens[i] << '\n';

    return 0;
}

如果唯一的要求是获得预期的输出,您可以使用 space (' ') 作为分隔符并修改打印。

int main()
{
    vector<string> vecOfStr;
    vector <string> tokens;
    // Get the contents of file in a vector
    bool result = getFileContent("add.sh", vecOfStr);
    string str = vecOfStr[2].c_str();
    string intermediate;

    // stringstream class check1
    stringstream check1(str);

    // Tokenizing w.r.t. space
    while(getline(check1, intermediate, ' '))
    {
        tokens.push_back(intermediate);
    }

    // Printing the token vector
    for(int i = 0; i < tokens.size(); i++)
    {
        if(tokens[i][0] == '-')
        {
            cout << endl;
        }
        else
        {
            if(i != 0) cout << ' ';
        }
        cout << tokens[i];
    }
    cout << endl;

    return 0;
}

或者,如果您希望将选项和值合并为标记向量中的一个值,您可以相应地修改向量中的值。

static constexpr char delimiter = ' ';

int main()
{
    vector<string> vecOfStr;
    vector <string> tokens;
    // Get the contents of file in a vector
    bool result = getFileContent("add.sh", vecOfStr);
    string str = vecOfStr[2].c_str();
    string intermediate;

    // stringstream class check1
    stringstream check1(str);

    // Tokenizing w.r.t. space
    while(getline(check1, intermediate, delimiter))
    {
        // non-option value found and already a value stored in the vector?
        if((intermediate[0] != '-') && (!tokens.empty()))
        {
            // combine previous and current token
            intermediate = tokens.back() + delimiter + intermediate;
            // and remove previous one from vector
            tokens.pop_back();
        }
        tokens.push_back(intermediate);
    }

    // Printing the token vector
    for(int i = 0; i < tokens.size(); i++)
        cout << tokens[i] << endl;

    return 0;
}

在将 intermediate 字符串推回到 token 向量之前,您应该在 intermediate 字符串中添加前缀 - 字符(第一个字符除外)。您需要注意要标记化的字符串的第一个字符为 - 的情况。在这种情况下,第一个标记字符串将为空字符串。

实施:

    // Tokenizing w.r.t. space '-'
    getline(check1, intermediate, '-');

    if (!intermediate.empty()) {
        tokens.push_back(intermediate);
    }

    while(getline(check1, intermediate, '-'))
    {
        intermediate.insert(0, 1, '-');
        tokens.push_back(intermediate);
    }

输出:

# ./a.out                
add 
-Units 32 
-raid 111 
-log add.log 

对于这样的输入 - -someOpt x -Units 32 -raid 111 -log add.log

# ./a.out   
-someOpt x 
-Units 32 
-raid 111 
-log add.log