我遇到了段错误,似乎无法找到它

时间:2011-07-11 01:07:26

标签: c linux segmentation-fault

下面的代码是随机的segfaulting,我似乎无法看到它的问题。任何帮助,将不胜感激。我使用gdb和核心文件将它隔离到了这个函数。

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 个答案:

答案 0 :(得分:4)

该代码看起来还不错,至少乍一看。一种可能性是,如果传入一个非空终止的字符串,或者一个不可修改的字符串(例如字符串文字)。

对于它的价值,你的功能可以简化很多,比如:

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。

答案 1 :(得分:2)

你的输入是字符串文字(如chomp(“carrot”))还是指向字符串文字的指针?在这种情况下,该函数将失败,因为字符串文字是只读的,您可以写入它。

如果您使用字符串文字作为此函数的输入,请尝试将其复制到缓冲区中,然后调用该函数。更好的是,如果可能的话,重新构造函数,以便str立即被复制到动态分配的缓冲区中,然后在整个函数的其余部分使用该缓冲区,并返回它。