我不知道这个代码在哪里有缺陷 - 主要是因为它在Win7下运行.exe(用MSVS2010编译)时工作正常,但它在Ubuntu(用g ++编译)下不起作用
以下是有问题的细分:
char * context = nullptr;
ifstream input("file.txt");
string line;
while(getline(input, line)) {
char * line1 = new char[line.size() + 1];
copy(line.begin(), line.end(), line1);
line1[line.size()] = '\0';
char * token = strtok_r(line1, " ", &context);
if(labela(token))
cout << "yes";
else
cout << "no";
// ...
token = (nullptr, " ", &context);
}
// ...
这是labela(...)
bool labela(char * c) {
if(c == nullptr)
return false;
int i = 0;
while(c[i] != '\0')
++i;
if(c[--i] == ':')
return true;
return false;
}
这是怎么回事?我不知道为什么它有时会识别标签,有时候不会。
这些是应该识别标签的行示例:
标签:其余部分
或
标签:
下一行
答案 0 :(得分:0)
有时候最好使用C ++自己的字符串函数而不是C字符串函数。
要获取字符串的第一个单词,您只需使用substr()
:
char* context = 0;
ifstream input("file.txt");
string line;
while(getline(input,line)) {
// char* line1 = new char[line.size()+1];
// copy(line.begin(),line.end(),line1);
// line1[line.size()] = '\0';
// char* token = strtok_r(line1, " ", &context);
string token = line.substr(0, line.find(" "));
if(labela(token))
cout << "yes";
else
cout << "no";
...
您仍然可以使用labela()
:
bool labela(string c) {
if (c.empty())
return false;
...