我正在编写一个版本的strcmp,它可以选择仅根据空格和字母数字字符(目录顺序)来比较字符串,也可以选择不区分大小写(Kernighan和Ritchie第121 5-16页)。因此,我想出了以下几点:
int strcmpdf (char* s, char* t)
{
char a[100];
char b[100];
int i;
int j;
i = j = 0;
if (directory){ /*compares strings solely on the basis of alphanumeric/space characters*/
for ( ; *s != '\0'; s++)
if (isalnum(*s) || isspace (*s) || *s == '\t' || *s == '\n')
a[i++] = (fold && islower(*s))? toupper(*s) : *s;
a[i] = '\0';
for ( ; *t != '\0'; t++)
if (isalnum(*t) || isspace (*t) || *t == '\t' || *t == '\n')
b[j++] = (fold && islower(*t))? toupper(*t) : *t;
b[j] = '\0';
return strcmp(a,b);
}else if (fold && !directory){/*folds upper and lower cases together*/
for ( ; toupper(*s) == toupper(*t); s++,t++)
if (*s == '\0')
return 0;
return toupper(*s) - toupper(*t);
}else
return strcmp(s,t);
}这很好地解决了这个问题,但是当我开始使用char指针而不是数组时,问题就开始了。当我初始化char* a和char* b而不是数组a和b,并在第11和12行用*a++替换ai++,在第15和16行用*b++替换bj++时,我得到了一个分段错误。当a+i是ai的地址时,为什么会出现这个错误?
发布于 2012-12-21 17:58:49
当你声明一个像'char a100‘这样的数组时,它会在堆栈上分配100个字符(字节),'a’指向第一个字符。
当你声明一个像'char *a‘这样的指针时,它一开始并没有指向任何有效的东西。您不能将任何内容赋值给'*a‘,除非它引用了有效的内容。
你可以这样做:
char aa[100];
char *a = aa;
*a = '\0';(当我开始学习C语言时,我自己也犯了类似的错误,并且也有seg错误)。
https://stackoverflow.com/questions/13987627
复制相似问题