用连字符“-”标记字符串后,连字符将被删除!!如何在 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
下面 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