0

我正在编写一个 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[i++] 替换为 *a++ 并在第 15 和 16 行将 b[j++] 替换为 *b++ 时,我得到分段错误。当 a+i 是 a[i] 的地址时,为什么会出现此错误?

4

1 回答 1

1

当你声明一个数组如'char a[100]'时,它会在栈上分配100个字符(字节),'a'指向第一个字符。

当你声明一个像'char *a'这样的指针时,它最初并不指向任何有效的东西。在它引用有效的东西之前,您不能将任何东西分配给 '*a'。

你可以做的是这样的:

char aa[100];
char *a = aa;

*a = '\0';

(当我开始学习 C 时,我自己也犯了类似的错误,并且也出现了段错误)。

于 2012-12-21T09:58:48.850 回答