Проблема с памятью в моей функции Sub String в C? - PullRequest
0 голосов
/ 06 октября 2010

У меня есть эта функция C, которая пытается сказать, содержится ли в строке подстрока.

int sub_string(char parent [1000], char child [1000]){

  int i;
  i = 0;
  int parent_size = (int) strlen(parent);
  int child_size = (int) strlen(child);
  char tempvar [child_size];

  int res;
  res  = 1;

  while(i<(parent_size - child_size + 1) && res != 0){

   strncpy(tempvar, parent + i, child_size);

   if(strcmp(tempvar, child)==0){
      res = 0;
   }
   i++;

   memset(tempvar, 0, child_size);
  }

  memset(tempvar, 0, sizeof(tempvar));
  return res;
}

Теперь странно то, что когда я передаю строку "HOME_DIR = / tmp /" и "HOME_DIR", в первый раз возвращается 0, но после повторного вызова этой функции возвращается 1, чтобы сказать, что не нашел его !!

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

Ответы [ 4 ]

1 голос
/ 06 октября 2010

Я заметил некоторые проблемы с этой программой:

  1. Используйте указатели вместо фиксированных массивов символов.Это больше места оптимально.Таким образом, ваше определение функции становится int sub_string(char *parent, int parent_len, char *child, int child_len).Обратите внимание, что, так как я передаю указатели, мне также нужно передать длину строки, чтобы я знал, сколько нужно пройти.Итак, теперь вы получаете доступ к своей строке, например, *(parent+i) в цикле.
  2. i<(parent_size - child_size + 1) Это условие выглядит немного рискованным для меня.Давайте предположим, что parent равен 100 в len, а child - 75. Таким образом, это выражение становится i<26.Теперь ваш цикл завершится, когда i>26.Так что tempvar будет иметь parent_string до индекса 25. Итак, как это работает снова?
1 голос
/ 06 октября 2010

Одна проблема:

char tempvar [child_size];

В приведенной ниже строке будет сравниваться значение child_size +1 (включая завершение '\ 0'), поэтому его неопределенное поведениеЗнаете ли вы C-стандартные функции strstr и strncmp?

1 голос
/ 06 октября 2010

Есть ли причина, по которой вы не можете использовать функцию strstr? В противном случае есть некоторые вещи, которые вы должны очистить в своем коде. Для начала, поскольку вы ограничиваете длину массивов, входящих в 1000 символов, вы должны использовать strnlen вместо strlen с пределом 1000. Вы также должны создать, что вы должны обнулить массив tempvar, прежде чем начать копирование в него. Если parent не имеет нулевого завершения, вы можете запустить конец массива в цикле while. Я бы также предложил использовать strncmp и задать ограничение длины (в общем, если вы используете библиотеку строк C, вы должны использовать 'n' версию функций, т.е. strnlen вместо strlen, чтобы вы указали ограничивающую длину для операции, это помогает защитить переполнение буфера и возможные дыры в безопасности вашего кода).

0 голосов
/ 06 октября 2010

sizeof(tempvar) не возвращается child_size.

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