2015-06-08 2 views
0

Я понятия не имею, где этот код испорчен - в основном потому, что он отлично работает, когда я запускаю .exe под Win7 (скомпилирован с MSVS2010), но он не работает под Ubuntu (скомпилирован с г ++)C++ string и char * manipulation действующий weird

Вот проблемные сегменты:

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; 
} 

что с этим? Я понятия не имею, почему он иногда распознает ярлык, а иногда и нет.

Это примеры строк, в которых он должен признать ярлык:

этикетки: остальные линии

или

этикетки:
следующая линия

+2

У вас есть плохое состояние, если с [0] равен нулю , –

+0

'token = (NULL," ", & context);' Это фактический код? И какова реальная цель функции «labela»? Как бы то ни было, я готов поспорить, что ему не нужно проходить через этот головной уборщик петли. Изменить: все, что вы делаете, это поиск символа ':'? – PaulMcKenzie

+0

http://en.cppreference.com/w/cpp/string/byte/strchr Кроме того, если вы не выпустили эту память в цикле, вы пропустите память на каждой итерации. – PaulMcKenzie

ответ

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