下面的代码是随机的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;
}
答案 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立即被复制到动态分配的缓冲区中,然后在整个函数的其余部分使用该缓冲区,并返回它。