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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
#1

warning strtok - C++

13.10.2011, 00:03. Просмотров 1031. Ответов 10
Метки нет (Все метки)

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

Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok - C++
Задача Дана строка слов с разделителями, в данном примере слова с пробелами Нужно, используя функцию strtok, сформировать из этих слов...

Warning C4101 и warning C4996 - C++
Здравствуйте, пишу программу "Домашняя видеотека", в которой необходимо реализовать запить информации про фильм и поиск по жанру, и что бы...

strtok - C++
Почему так работает #include <stdafx.h> #include <conio.h> using namespace std; int main(){ char string = "a string, of ,...

strtok - C++
как с помощью функции strtok вывести последнее слово

strtok - C++
Привет! Решаю задачку на строки char. Возникла проблема вот код: //vuravnivanie slov po levomy i pravomy pol9m stranicu ...

strtok - C++
Скажите, если ли функция, аналог strtok, для типа string?

10
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.10.2011, 00:06 #2
Строка "bla bla bla" является константной. А функция strtok изменяет строку. Получается, что strtok пытается изменить константную строку. Поэтому и ошибка.
Варнинг говорит, что эта функция может быть опасной. Действительно, она изменяет строку, которую получает первым параметром.
1
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:13  [ТС] #3
если объявить
C++
1
2
char* bla = "bla bla bla";
char* bla2 = strtok(bla, " ");
без слова const, то тот же варнинг
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.10.2011, 00:19 #4
Еще раз повторю: варнинг не имеет отношение к этой ошибке. Варнинг просто есть и все. Просто предупреждение для программиста.
А то что вы и так и так написали, то разницы нет. Вы и в том и в том случае пишите "bla bla bla".
Во втором случае используете указатель на эту строку. Но если указатель
C++
1
char *bla
, т.е. не
C++
1
const char *bla
, то это не значит, что данные можно изменять.
Дело не в указателе bla, а в строку "bla bla bla"
0
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:33  [ТС] #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);
    }
 
}
и сразу выбивает ошибку, внутрь фора даже не заходит... как исправить?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.10.2011, 00:35 #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);
        }
 
}
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 00:43 #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);
        }
 
}
2
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.10.2011, 00:45 #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;
 
}
2
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:46  [ТС] #9
точно) просто я думал, что если параметр конструктора char*, то даже если передадим строку, он не будет константным... спасибо!
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 00:57 #10
в спешке забыла про delete. точно(
0
Thinker
Эксперт С++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.10.2011, 09:28 #11
Добавлю, что strtok заменяет символы разделители на символ '\0', а если объявить строку типа
char *s = "abc...",
то компилятор может ее поместить в область памяти read only (только для чтения) и изменять символы будет нельзя, поэтому запись strtok(s, " ") ошибочна.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 09:28
Привет! Вот еще темы с ответами:

Не работает strtok() - C++
Здравствуйте, нужно посчитать количество слов в файле. Подскажите пожалуйста, что не так. Выводит только первую строку и все, количество...

strtok не работает - C++
Почему не работает код? #include <string.h> #include <iostream.h> #pragma argsused int main(int argc, char* argv) { ...

Strtok и strtok_s - C++
Доброго времени суток. Есть вот такой код: Info::Info(ifstream &f) { char STR=""; char *delim = "\t"; char *ptr; ...

Двойной strtok - C++
Всем привет! Возник такой вопрос. В ходе решения одной задачи, связанной с разбиением строки на некоторые подмножества слов,...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
13.10.2011, 09:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru