Форум программистов, компьютерный форум CyberForum.ru

warning strtok - C++

Восстановить пароль Регистрация
 
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:03     warning strtok #1
Пишу в 10 студии:
C++
1
char* bla = strtok("bla bla bla", " ");
Выдаёт варнинг: This function or variable may be unsafe. Consider using strtok_s instead.... И пры выполнении программы на этой строке выкидывает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 00:03     warning strtok
Посмотрите здесь:

strtok C++
strtok C++
Strtok() и string C++
C++ strtok
strtok C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.10.2011, 00:06     warning strtok #2
Строка "bla bla bla" является константной. А функция strtok изменяет строку. Получается, что strtok пытается изменить константную строку. Поэтому и ошибка.
Варнинг говорит, что эта функция может быть опасной. Действительно, она изменяет строку, которую получает первым параметром.
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:13  [ТС]     warning strtok #3
если объявить
C++
1
2
char* bla = "bla bla bla";
char* bla2 = strtok(bla, " ");
без слова const, то тот же варнинг
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.10.2011, 00:19     warning strtok #4
Еще раз повторю: варнинг не имеет отношение к этой ошибке. Варнинг просто есть и все. Просто предупреждение для программиста.
А то что вы и так и так написали, то разницы нет. Вы и в том и в том случае пишите "bla bla bla".
Во втором случае используете указатель на эту строку. Но если указатель
C++
1
char *bla
, т.е. не
C++
1
const char *bla
, то это не значит, что данные можно изменять.
Дело не в указателе bla, а в строку "bla bla bla"
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:33  [ТС]     warning strtok #5
у меня есть класс, в конструкторе я делаю
C++
1
2
3
4
5
6
7
8
BufferCreator::BufferCreator(char* str)
{
    for (char* rule = strtok(str, ";"); rule != NULL; rule = strtok(NULL, ";"))
    {
        strcat(res, rule);
    }
 
}
и сразу выбивает ошибку, внутрь фора даже не заходит... как исправить?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.10.2011, 00:35     warning strtok #6
Указатель на что указывает? Покажите то место, где вы создаете строку и вызываете этот метод.
И еще, зачем вы каждый раз в цикле вызываете strtok(str, ";"); ?
Достаточно только 1 раз вызвать, а потом вызывать strtok(NULL, ";");.
В итоге так должно быть:
C++
1
2
3
4
5
6
7
8
BufferCreator::BufferCreator(char* str)
{
        for (char* rule = strtok(str, ";"); rule != NULL; rule = strtok(NULL, ";"))
        {
                strcat(res, rule);
        }
 
}
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 00:43     warning strtok #7
Это же у вас конструктор, и вы туда наверняка передаете строку в кавычках
C++
1
BufferCreator a("aa;bb");
так?
А внутри функции пытаетесь изменить эту строку "aa;bb", но так делать нельзя
попробуйте что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
BufferCreator::BufferCreator(char* str)
{
    char *temp=new char[strlen(str)+1];
    strcpy(temp, str);
 
        for (char* rule = strtok(str, ";"); rule != NULL; rule = strtok(NULL, ";"))
        {
                strcat(res, rule);
        }
 
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.10.2011, 00:45     warning strtok #8
Так правильнее
C++
1
2
3
4
5
6
7
8
9
10
11
12
BufferCreator::BufferCreator(char* str)
{
        char *temp=new char[strlen(str)+1];
        strcpy(temp, str);
 
        for (char* rule = strtok(temp, ";"); rule != NULL; rule = strtok(NULL, ";"))
        {
                strcat(res, rule);
        }
        delete [] temp;
 
}
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:46  [ТС]     warning strtok #9
точно) просто я думал, что если параметр конструктора char*, то даже если передадим строку, он не будет константным... спасибо!
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 00:57     warning strtok #10
в спешке забыла про delete. точно(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 09:28     warning strtok
Еще ссылки по теме:

Функция strtok() C++
Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok C++
C++ Warning C4101 и warning C4996

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.10.2011, 09:28     warning strtok #11
Добавлю, что strtok заменяет символы разделители на символ '\0', а если объявить строку типа
char *s = "abc...",
то компилятор может ее поместить в область памяти read only (только для чтения) и изменять символы будет нельзя, поэтому запись strtok(s, " ") ошибочна.
Yandex
Объявления
13.10.2011, 09:28     warning strtok
Ответ Создать тему
Опции темы

Текущее время: 09:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru