Чтобы найти подстроку в данном тексте .. C-программа - PullRequest
3 голосов
/ 05 мая 2010
char *substring(char *text, int position, int length)
{
   int i, j=0;
   char *temp ;

   for(i=position-1; i<position+length-1; i++)
   {
     temp[j++] = text[i];
   }
   temp[j] = '\0';

   return temp;
}

Привет. В чем заключается ошибка в следующем коде .. Я пытаюсь запустить это на компьютере Fedora .. И это дает мне ошибку времени выполнения "Ошибка сегментации". Что это за ошибка .. и почему она дает эту ошибку ..

Спасибо ..

Ответы [ 6 ]

6 голосов
/ 05 мая 2010

temp неинициализирован.

3 голосов
/ 05 мая 2010

Вам нужно выделить память для temp - на данный момент это просто dangling pointer. Вы можете использовать malloc для этого, но учтите, что вызывающая сторона должна убедиться, что впоследствии это хранилище free d

Например:

char *substring(const char *text, int position, int length)
{
   char *temp = malloc(length + 1);
   int i, j;

   for (i = position, j = 0; i < position + length; i++, j++)
   {
       temp[j] = text[i];
   }
   temp[j] = '\0';

   return temp;
}
2 голосов
/ 05 мая 2010

Это означает, что ваш код нарушил некоторые ограничения, установленные операционной системой, в этом случае вы пишете в память, к которой у вас нет прав записи.

Это потому, что ваша переменная temp является просто неинициализированным указателем, она не содержит адрес памяти, куда вы можете писать.

Если вы планируете писать length + 1 символов, оно должно указывать как минимум на столько байтов пространства.

Поскольку вы ожидаете вернуть строку, вам нужно либо сделать ее static (но это может быть опасно), либо динамически распределить пространство:

if((temp = malloc(length + 1)) == NULL)
  return NULL;
0 голосов
/ 05 мая 2010

Это очевидно из кода, который вы пропустили, чтобы выделить / инициализировать указатель * temp. Он указывает в никуда.

Вы должны использовать malloc или strdup и делать все остальное. Но да, вы также можете изучить использование strncpy (null terminate) для упрощения кода.

0 голосов
/ 05 мая 2010

Я делаю копию подстроки в другой указатель, это просто простой способ найти одну подстроку данной строки ..

Надеюсь, что это очень простой способ в правильной манере ..

Кроме того, методы, данные SysAdmin, выглядят довольно сложными, но все же спасибо за предложение. Я также постараюсь изучить их. Но если вы можете сказать мне, реализовал ли я самый простой поиск по шаблону алгоритм правильно, то было бы очень любезно ..

Спасибо ..

0 голосов
/ 05 мая 2010

пока ответ очевиден - то есть температура не инициализирована, вот предложение.

Если вы хотите найти подстроку в другой строке, несколько альтернатив,

1. use C strstr(...)
2. Robin-Karp method
3. Knuth-Morris-Pratt method
4. Boyer Moore method

Update: Изначально я думал, что этот вопрос связан с поиском подстроки (основываясь на заголовке). В любом случае, это похоже на реализацию strchr ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...