Я получаю segfault и не могу найти его - PullRequest
0 голосов
/ 11 июля 2011

Приведенный ниже код является случайным segfaulting, и я не вижу, в чем проблема Любая помощь будет оценена. Я изолировал его для этой функции, используя файлы gdb и core.

char* chomp(char *str)
{
   unsigned int scan_ind, curr_ind;

   scan_ind = curr_ind = 0;

   while(str[scan_ind])
   {
      if(str[scan_ind] != 0x0A &&
         str[scan_ind] != 0x0D)
      {
         if(curr_ind != scan_ind)
            str[curr_ind] = str[scan_ind];

         curr_ind++;
      }

      scan_ind++;
   }

   str[curr_ind] = 0;

   return str;
}

Ответы [ 2 ]

4 голосов
/ 11 июля 2011

Этот код выглядит хорошо, по крайней мере, на первый взгляд.Одна возможность, если вы передаете строку, которая не оканчивается нулем, или строку, которая не может быть изменена (например, строковый литерал).что-то вроде:

char *chomp (char *str) {
    char *from = str;                         // This is the pointer for reading.
    char *to = str;                           // This is the pointer for writing.

    while (*from != '\0') {                   // Until end of string.
      if((*from != '\n') && (*from != '\r'))  // Transfer desired characters only.
          *to++ = *from;                      // Only increase write pointer if transferred.
      from++;                                 // Increase read pointer no matter what.
   *to = '\0';                                // Truncate string if necessary.
   return str;                                // And return the in-situ modified string.
}

Это не поможет вам с ненулевыми завершенными строками или строковыми литералами, но это немного короче и больше похоже на C.

2 голосов
/ 11 июля 2011

Может ли быть, что ваш ввод является строковым литералом (например, chomp ("carrot")) или указателем на строковый литерал? В этом случае функция завершится ошибкой, потому что строковые литералы доступны только для чтения, и вы пишете в нее.

Если вы используете строковый литерал в качестве входных данных для этой функции, попробуйте скопировать его в буфер и затем вызвать функцию. Еще лучше, если это возможно, реструктурировать функцию так, чтобы str немедленно копировался в динамически выделенный буфер, а затем использовать этот буфер в остальной части функции и возвращать его.

...