Понимание strtok_s

0

Это были времена, с которыми я работал с C++, поэтому, пожалуйста, несите меня.

Я разработчик С#, но это консольное приложение C++ сломалось, и теперь я управляю им. В настоящее время я отлаживаю его с помощью VS2010.

Из-за конфиденциальности и чистого количества кода я не могу опубликовать весь код.

Консоль по существу считывает и анализирует XML файл размером 6 МБ. Все, что работало до вчерашнего дня, где я получаю "Точка обнаружения нарушения доступа 0xcccccccc" со следующей строкой кода:

strtok_s(0, "=", &token);

Когда я помещаю курсор над "& token", я вижу ошибку "token = 0xcccccccc".

Я хотел прояснить несколько вещей:

strtok_s(buf, "=", &token);
strtok_s(0, "=", &token);
strtok_s(0, "=", &token);

что делает 0 в качестве параметра? Я предполагаю, что в первом * strtok_s * токен будет указывать на первый экземпляр char '=' в buf. Но во второй инструкции, какая цель "0"? Он ищет "=" внутри токена?

Очевидно, что что-то изменилось в XML. Итак, наконец, учитывая, что это синтаксический анализ файла размером 6 МБ (строки текста /870 КБ) и функция C++, которая читает XML, - это 700+ строки долго, что лучший способ отладить это? И нет, разрезание моих запястий еще не конкретизировано....

Благодарю.

  • 0
    Почему вы используете strtok_s ? Он не работает с std::string (это то, что вы хотите использовать для хранения ваших строк), и его нельзя использовать со строковыми литералами. Просто анализируйте, используя строковые итераторы.
  • 0
    Опасно никогда не проверять, имеет ли возвращаемое значение NULL.
Теги:
console-application
visual-studio-2010

3 ответа

2
Лучший ответ

Передача 0 в качестве первого аргумента (возможно, NULL более читаема) означает "найти следующий токен в строке". Увидев значение 0xcccccccc как значение последнего аргумента ("токен" - это неправильное имя) сообщает вам, что строка никогда не искала первый токен. Другими словами, вызов strtok_s(buf, "=". &token) и не был выполнен. Или значение "токена" не сохранилось из предыдущего вызова strtok_s(). Поэтому он больше не знает, какую строку нужно искать. Kaboom.

В любом случае это сложная ошибка в коде, на который не влияет сама строка.

0

Вот ссылка на MSDN, которая объясняет использование strtok_s с помощью примеров.

Первый параметр может быть NULL, если вы вызывали strtok_s как минимум один раз, а третий параметр уже содержит указатель на последний найденный токен. В таком случае следующий вызов strtok_s может занять его, откуда последний вызов нашел токен.

В частности, в вашем случае нарушение доступа обычно указывает на переполнение буфера или мусор в указателе. Что-то случилось с token переменной, что привело к тому, что ее значение стало 0xcccccccc. Вы должны указать код, в котором token принимает это значение, и найти причину перерасхода.

0

сначала af all, я бы DIFF "сломанный" XML-код и рабочий. Я ДУМАЮ, что вы обнаружите, что сломанный имеет меньше = где ожидалось.

0 или bette NULL в качестве первого параметра, будет просто повторно использовать токен

Ещё вопросы

Сообщество Overcoder
Наверх
Меню