strpbrk не работает - PullRequest
       1

strpbrk не работает

0 голосов
/ 01 мая 2011
char operators[] = "+-*/^(";  
    char* input = new char[100];  
    char* output = new char[100];  
    char* operadores = new char[100];  
    char* pch = input;  
    char* pch2 = input;  
    cout << "Expresion: " <<endl; cin.getline(input,100);  
    cout << input <<endl;  
    pch2 = strpbrk (pch2, operators);  
    pch = strtok (pch, "+-*/^(");  
    while (pch != NULL){  
        strcat (output, pch);  
        pch = strtok (NULL, "+-*/^(");  
        strcat (operadores, pch2);  
    }  

    cout << "Salida: " << output <<endl;
    cout << "Operadores: " << operadores <<endl;
    cout << "Entrada: " << input <<endl;
    cout << "pch2 = " << pch2 <<endl;

Привет! Моя проблема в том, что функция strpbrk не работает, она не возвращает NULL, я это доказал. Но мне нужно положить символ в стеке, и cout не показывает мне, на какой символ указывает pch2.

1 Ответ

1 голос
/ 01 мая 2011

Вы путаете себя - программа предназначена для того, чтобы запутать.

У вас есть pch и pch2, указывающие на одну и ту же строку ввода - input.Вы звоните strpbrk(), чтобы найти одного из операторов, сохраняя эту позицию в pch2.Затем вы вызываете strtok() для pch, и он находит только что найденный символ strpbrk() и записывает NUL '\0' поверх него.Итак, похоже, что pch2 указывает на NUL в конце строки.В теле цикла вы затем соединяете пустую строку, на которую указывает pch2, с вашим целевым списком операторов.

Лично я избегаю использования strtok() именно потому, что он искажает входную строку.Если вы собираетесь его использовать, вам, вероятно, придется работать с дубликатом строки, потому что strtok() записывает в него NUL-байты.

Ваш диагностический вывод в конце должен показывать, что первый разделиз ввода - до первого оператора - только.

Остерегайтесь приведения приведений к функциям стандартной библиотеки или «не работают» компиляторы.Это знак Tyro;99,9999% времени, это ошибка пользователя, а не системная ошибка.В тех очень, очень, очень редких случаях, когда вы правы (ооо, смотрите - я только что выиграл свой третий многомиллионный лотерейный приз; это более вероятно, даже если я не покупаю лотерейные билеты), такВы описываете проблему иначе.Вы описываете проблему как одно из крайнего удивления;вы документируете рабочие тестовые случаи;затем вы объясняете, как должен работать найденный вами крайний случай, и результат - и вы до сих пор не уверены, является ли это ошибкой в ​​вашем коде или в системе.


Как другие диагностировали,вы не инициализируете operadores пустой строкой, поэтому конкатенация к ней приводит к неопределенному поведению.

На самом деле нет необходимости выделять 100-байтовые строки:

char input[100];  // Cleaner, simpler, more reliable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...