0

これは少し奇妙な質問です。

C関数を書きました。その「のような」strchr/strrchr。c文字列内の文字を検索することになっていますが、逆方向に移動して、その文字へのポインタを返します。c文字列は「nullで開始」されないため、3番目のパラメータ「count」も取ります。これは、逆方向に見る必要のある文字数を示します。

/*
*s: Position from where to start looking for the desired character.
*c: Character to look for.
*count: Amount of tests to be done
*
* Returns NULL if c is not in (s-count,s)
* Returns a pointer to the occurrence of c in s.
*/
char* b_strchr(const char* s,int c,size_t count){

    while (count-->0){

        if (*s==c) return s;
        s--;
     }
     return NULL;
}

私はそれについていくつかのテストをしました、しかしあなたはそれに何か欠陥を見ますか?セキュリティの問題かそこら?何か機能強化はありますか?改善できますか?そしてもっと重要なのは、これは悪い考えですか?

いくつかの使用法。

    char* string = "1234567890";

    printf("c: %c\n",*b_strchr(string+9,'5',10));//prints 5

    printf("c: %c\n",*b_strchr(string+6,'1',7));//prints 1

編集:新しいインターフェース、いくつかの変更。

/*
* from:  Pointer to character where to start going back.
* begin: Pointer to characther where search will end.
*
* Returns NULL if c is not between [begin,from]
* Otherwise, returns pointer to c.
*/
char* b_strchr(const char* begin,int c,const char* from){


    while (begin<=from){

        if (*from==c) return from;
        from--;
     }
     return NULL;
}
4

4 に答える 4

5

編集で改善されましたが、インターフェースは依然として驚くべきものです。beginパラメータ (検索対象の干し草の山) を最初のパラメータ、cパラメータ (検索対象の) を 2 番目、fromパラメータ (検索の開始位置) を 3 番目に配置します。この順序は、かなり大規模な API セット全体で慣用的なようです。

于 2009-07-03T02:42:43.390 に答える
2

The code has an esoteric interface - pass in a pointer to the last character of the string and the length of the string. That will lead to problems using it.

(Alternatively, the code has a bug - you should add count to s before the loop.)

于 2009-07-03T01:49:02.290 に答える
1

C 関数を書きました。その「類似」strchr / strrchr。

あなたは を再発明しようとしたstrrchr()ので、 とは違いstrchr()ます。

そこに欠陥はありますか?

はい。いくつかの。:-(

b_strchr()を返すことができるので、ステートメントNULLに直接入れるべきではありません。デファレンシングは通常、segfault を引き起こしますprintf()NULL

あなたのお気に入りのバリエーションを使ったほうがいいかもしれません...

char *result;

result = b_strchr(string + 9, 'a', 10));
if (result == NULL)
{
    printf("c: NULL\n");
}
else
{
    printf("c: %c\n", *result);
}

また、いつ

(count >= length of the input string) and the character is not found

は文字列内の文字を指していないため、予測できない結果が得られsます — 文字s列の先頭より前のメモリを指しています。例として、試してみてください

result = b_strchr(string + 9, 'a', 11));
if (result == NULL)
{
    printf("c: NULL\n");
}
else
{
    printf("c: %c\n", *result);
}

そして何が起こるか見てください。

ユース テスト ケースを拡張して、正常に動作することがわかっている以外の条件を含めます。コードを実際にテストするテスト ケースの設計を手伝ってくれるよう、他の人に依頼してください。

さらに重要なことは、これは悪い考えですか?

学習演習としては、絶対にありません。

ただし、この場合、製品コードの場合は、標準に固執する方がよいでしょうstrrchr()

于 2009-07-03T03:27:16.917 に答える
1

begin が from の場合、現在のコードは常に begin を返しますが、これは望ましくありません。ループの後のコードは、NULL を返すだけです。そして、ループ条件で begin != from の代わりに begin < from を使用します。そうしないと、誰かがパラメーターの順序を混同したときにポインター算術オーバーフローが発生します。

編集: [begin, from] が必要なので、もう一度考えてみると、begin <= from にする必要があります。

于 2009-07-03T02:58:23.040 に答える