C ++字符串和char *操作表现得很奇怪

时间:2015-06-08 20:54:55

标签: c++ string ubuntu char g++

我不知道这个代码在哪里有缺陷 - 主要是因为它在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;
}

这是怎么回事?我不知道为什么它有时会识别标签,有时候不会。

这些是应该识别标签的行示例:

标签:其余部分

标签:
下一行

1 个答案:

答案 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;
    ...