Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Belkin Slava
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 13
1

strtok - изменение данных при использовании

16.12.2012, 01:03. Просмотров 1028. Ответов 8
Метки нет (Все метки)

Здравствуйте!

При написании программы столкнулся со следующей проблеммой...
Вот код (все лишнее из своей программы вырезал - чтобы показать ошибку):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main ()
{
  char *str ="This a sample string";
  char *pch;
  char *rt=str;
  
  pch = strtok (str," ");
  printf ("%s\n",str);
  
  printf ("%s\n",rt);
  
  return 0;
}
Когда использую функцию strtok, то происходит магическое изменение содержимое переменной rt
Тоесть после токо как str разбивается по пробелам, то содержимое rt будет "This"
Вот тут я вступоре совсем, это как такое возможно
Отдельный указатель вроде на переменную, ну окей ей присваиваю содержимое str, причем естественно если str изменю (после того, как rt=str) - то содержимое rt никак не изменится.
Но Как токо использую strtok - все...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 01:03
Ответы с готовыми решениями:

Исправить ошибку при использовании strtok
Здравствуйте! Подскажите, пожалуйста, почему в строчке № 6 - &quot;char *s =...

Strtok для двумерного массива строк: При первом же заходе в цикл, функция возвращает NULL
Суть вот в чем: нужно ввести массив строк, затем в каждой строчке выделить 5-ое...

Что такое p=strtok(str," "), p=strtok(0," ")?
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;locale&gt; int main() { ...

Ошибка при при использовании realloc
В методе AddItem вылетает ошибка доступа к памяти... С чем это может быть...

Ошибка при использовании strlen
scanf(&quot;%s&quot;,&amp;s); d=strlen(s); чего ошибка?

8
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.12.2012, 10:03 2
Belkin Slava, так а в чем собственно проблема?
0
Байт
Эксперт C
18938 / 12155 / 2537
Регистрация: 24.12.2010
Сообщений: 24,746
16.12.2012, 13:01 3
Указатель rt не меняется, он как указывал на область памяти где содержалось "This a sample string", так и указывает. Функция strtok вместо первого пробела ставит 0.
Как ты меняешь str ? Если так str = "New string", то str стал уже указывать на другую область памяти
1
Belkin Slava
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 13
16.12.2012, 13:23  [ТС] 4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  char *str ="This a sample string";
  char *pch;
  char *rt=str;
  
  printf ("%s\n",rt);
  //     "This a sample string";
 
  pch = strtok (str," ");
  
  printf ("%s\n",rt);
  //     "This";
  
  return 0;
}
Желалось бы чтобы после использования strtok rt не изменялось)
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.12.2012, 14:02 5
Цитата Сообщение от Belkin Slava Посмотреть сообщение
Желалось бы чтобы после использования strtok rt не изменялось)
Ну так скопируй всю строку в новый массив перед использованием strtok.
1
Байт
Эксперт C
18938 / 12155 / 2537
Регистрация: 24.12.2010
Сообщений: 24,746
16.12.2012, 14:13 6
Цитата Сообщение от Belkin Slava Посмотреть сообщение
Желалось бы чтобы после использования strtok rt не изменялось)
Или придумай другую функцию
Ты хорошо понимаешь, что такое указатель?
1
Belkin Slava
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 13
16.12.2012, 14:27  [ТС] 7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main ()
{
  char str[] ="This a sample string";
  char *pch;
  char  rt[1024];
  
  strcpy(rt,str);
  
    printf ("%s\n",rt);
  pch = strtok (str," ");
  
  printf ("%s\n",rt);
  
  return 0;
}
Спасибо большое, конечно ж я копировал и до этого, только забывал при объявление хразмерность указывать...
0
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
16.12.2012, 14:48 8
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Байт Посмотреть сообщение
Ты хорошо понимаешь, что такое указатель?
Кстати про указатели... После объявления
Цитата Сообщение от Belkin Slava Посмотреть сообщение
char *str ="This a sample string";
вызов strtok
Цитата Сообщение от Belkin Slava Посмотреть сообщение
pch = strtok (str," ");
должен бы приводить к ошибке времени выполнения. И старый gcc именно так код и компилировал:
Bash
1
2
3
4
5
6
bash-3.2$ gcc -o belkin_strtok belkin_strtok.c
bash-3.2$ ./belkin_strtok
Bus error
bash-3.2$ gcc -dumpversion
4.0.1
bash-3.2$
str указывает на строковый литерал, который должен бы находиться в памяти "только для чтения". По какой причине не валится код, скомпилированный в последних версиях gcc, я не знаю, но что тогда должно происходить при таком подходе:
C
1
2
char * s = "Hello";
strcat(s, " world");
Таки скомпилируется и как-то отработает?

Впрочем в случае со strtok достаточно изменить объявление
C
1
char str[] = "This a sample string";
при этом после вызова strtok(str, " ") строка изменится на "This\0a\0sample\0string\0"; (в конце строки \0 ставится неявно при объявлении).
3
Байт
Эксперт C
18938 / 12155 / 2537
Регистрация: 24.12.2010
Сообщений: 24,746
16.12.2012, 17:37 9
Цитата Сообщение от easybudda Посмотреть сообщение
str указывает на строковый литерал, который должен бы находиться в памяти "только для чтения". По какой причине не валится код, скомпилированный в последних версиях gcc,
Угу! На этом деле я как-то здорово попался. Трое суток понять не мог. На моем компе транслируя под Борландом все отлично работало (я там аккуратненько один символ заменял, а затем восстанавливал. Причем все это происходило упрятанное в функцию, а то что мне ругалось, мол подставляешь const char* вместо char *, так я лихо игнорнул, сделав явное приведение) А когда скомпилировал на хосте (gcc, Linux) - все валилось. Т.е. там все действительно помещалось в память "read only". Но все-таки на одну дурость стал умнее
1
16.12.2012, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2012, 17:37

Ошибка при использовании delete
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; void main()...

Ошибка при использовании Clrscr
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include&lt;iostream&gt; double SumD(int...

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


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

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

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