Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
14 / 14 / 3
Регистрация: 12.07.2009
Сообщений: 114
1

warning strtok

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

Пишу в 10 студии:
C++
1
char* bla = strtok("bla bla bla", " ");
Выдаёт варнинг: This function or variable may be unsafe. Consider using strtok_s instead.... И пры выполнении программы на этой строке выкидывает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2011, 00:03
Ответы с готовыми решениями:

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

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

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

strtok
Почему так работает #include <stdafx.h> #include <conio.h> using namespace std; int main(){...

10
185 / 185 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
13.10.2011, 00:06 2
Строка "bla bla bla" является константной. А функция strtok изменяет строку. Получается, что strtok пытается изменить константную строку. Поэтому и ошибка.
Варнинг говорит, что эта функция может быть опасной. Действительно, она изменяет строку, которую получает первым параметром.
1
14 / 14 / 3
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:13  [ТС] 3
если объявить
C++
1
2
char* bla = "bla bla bla";
char* bla2 = strtok(bla, " ");
без слова const, то тот же варнинг
0
185 / 185 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
13.10.2011, 00:19 4
Еще раз повторю: варнинг не имеет отношение к этой ошибке. Варнинг просто есть и все. Просто предупреждение для программиста.
А то что вы и так и так написали, то разницы нет. Вы и в том и в том случае пишите "bla bla bla".
Во втором случае используете указатель на эту строку. Но если указатель
C++
1
char *bla
, т.е. не
C++
1
const char *bla
, то это не значит, что данные можно изменять.
Дело не в указателе bla, а в строку "bla bla bla"
0
14 / 14 / 3
Регистрация: 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
185 / 185 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
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
446 / 209 / 21
Регистрация: 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
185 / 185 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
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
14 / 14 / 3
Регистрация: 12.07.2009
Сообщений: 114
13.10.2011, 00:46  [ТС] 9
точно) просто я думал, что если параметр конструктора char*, то даже если передадим строку, он не будет константным... спасибо!
0
446 / 209 / 21
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 00:57 10
в спешке забыла про delete. точно(
0
Эксперт С++
4254 / 2228 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.10.2011, 09:28 11
Добавлю, что strtok заменяет символы разделители на символ '\0', а если объявить строку типа
char *s = "abc...",
то компилятор может ее поместить в область памяти read only (только для чтения) и изменять символы будет нельзя, поэтому запись strtok(s, " ") ошибочна.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2011, 09:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

Проблема с Strtok
Добрый день. Подскажите пожалуйста. Программ вылетает в момент использования strtok, не пойму в...

Strtok() и string
По заданию нужно воспользоваться именно strtok чтобы разбить строку что есть на слова (ориентируясь...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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