0

私は、スペースと英数字 (ディレクトリ順) に基づいてのみ文字列を比較するオプションと、大文字と小文字の区別を無視するオプションを持つ strcmp のバージョンを作成しています (Kerighan and Ritchie page 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 ポインターを使用し始めると問題が発生します。配列 a と b の代わりに、char* a と char* 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 に答える