Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
1

Парсинг строки и ошибка сегментации

27.01.2013, 15:00. Просмотров 895. Ответов 6
Метки нет (Все метки)

Здраствуйте. Нужно было распарсить строчку. Взялся за strtok. Написал небольшой пример, для себя, что-бы убедится в правильности использования:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
 
int main(){
  char* str = "Hellow World! This string will be tokenized."
  char* delimiters = " .!";
  char* next = strtok(str, delimiters);
  while(next != NULL){
     printf("%s\n", next);
     next = strtok(NULL, delimiters);
  }
  return 0;
}
во время выполнения получаю ошибку сегментации(см. скрин)

дале зашел уже на С++ Reference - strtok посмотрел прототип функции - все правильно. у меня так же char*
потом посмотрел на пример который там приведен ниже. скомпилировав и выполнив его я удивился - оно рабоает!
оказывается все дело в пятой строчке моего кода. то есть:
C
1
2
3
4
// вместо
char* str = "Hellow World!..";
// надо
char str[] = "Hellow World!..";
собственно почему так? ведь, если я не ошибаюсь, в обеих случаях, str - это указатель на начало масива(строки). может кто просветить почему так?
0
Миниатюры
Парсинг строки и ошибка сегментации  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 15:00
Ответы с готовыми решениями:

Ошибка сегментации
всем здраствуйте. double power(double n, int p) //определение функции 22 { 23 if (n...

Ошибка сегментации
собственно прикрепляю проект (code::blocks). при запуске вылетает ошибка. почему - хз.

Ошибка сегментации
# include &lt;sys/types.h&gt; # include &lt;sys/times.h&gt; # include &lt;sys/socket.h&gt; # include &lt;stdio.h&gt; #...

Ошибка сегментации
Задача: В двух файлах дано 2 массива. Вывести эти 2 массива в третий файл в отсортированном виде....

Ошибка сегментации
Есть вот такой код: #include &lt;stdio.h&gt; typedef struct{ char *temp; }strman;...

6
PsihoSocial
1 / 1 / 1
Регистрация: 27.01.2013
Сообщений: 9
27.01.2013, 15:05 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
int main(){
  char str[] = "Hellow World! This string will be tokenized.";
  char* delimiters = " .!";
  char* next = strtok(str, delimiters);
  while(next != NULL){
     printf("%s\n", next);
     next = strtok(NULL, delimiters);
  }
  system("pause");
  return 0;
}
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
27.01.2013, 15:13  [ТС] 3
я понял, что нужно так. прочитайте последний абзац первого поста.
0
fasked
Эксперт С++
5000 / 2579 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.01.2013, 16:34 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от lowercase Посмотреть сообщение
собственно почему так? ведь, если я не ошибаюсь, в обеих случаях, str - это указатель на начало масива(строки). может кто просветить почему так?
Да, все так. Но в случае с char *str = "" указатель этот указывает на read-only область памяти; strtok же в свою очередь пытается модифицировать переданную первым аргументом строку. Вот и получается segfault.

Цитата Сообщение от man strtok
Be cautious when using these functions. If you do use them, note that:
* These functions modify their first argument.
* These functions cannot be used on constant strings.
* The identity of the delimiting byte is lost.
* The strtok() function uses a static buffer while parsing, so it's not thread safe. Use strtok_r() if this matters to you.
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
27.01.2013, 17:44  [ТС] 5
полоучается, это только потому, что строка инициализируется на этапе компиляции?
0
fasked
Эксперт С++
5000 / 2579 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.01.2013, 19:14 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от lowercase Посмотреть сообщение
полоучается, это только потому, что строка инициализируется на этапе компиляции?
Нет, дело не в этом. Банальный пример
C
1
2
char *str = "hello";
str[0] = 'H';
тоже приведет к SEGFAULT. Потому что память выделяется только для указателя, а не для массива символов. Если быть точным, то указатель и массив это не одно и тоже. char[] это массив, а char* всего лишь указатель.

Не по теме:

Вам следует подробнее почитать про модель памяти :)

0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
27.01.2013, 20:53  [ТС] 7
хм. забавно ведь я с указателями и выделением памяти уже около пол года работаю(с тех пор как начал изучать си), но чтото раньше не замечал этого.
хорошо, спасибо. почитаю про память.
0
27.01.2013, 20:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2013, 20:53

Ошибка сегментации
Написал программу, которая по схеме Горнера преобразует многочлен до квадратного уравнения. По...

Непонятная ошибка сегментации
Собственно код #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt;...

Ошибка сегментации gcc
Здравствуйте, уважаемы форумчане) Пытаюсь реализовать шифр Плейфера. Компилируется нормально,...


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

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

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