この機能は、任意のより安全なことはできますか?ヒントや自分の考えを探して!

StackOverflow https://stackoverflow.com/questions/1077479

  •  21-08-2019
  •  | 
  •  

質問

これはやや奇妙な質問のである。

私はCの関数を書きました。そのstrchr / strrchr 'のような'。 C文字列内の文字を探しになって、しかし逆方向に行くと、それへのポインタを返すです。 C文字列は「ヌルが開始」されていないとして、それはまた、それが逆方向になります文字の数を示す、三番目のパラメータ「数」を取ります。

/*
*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

EDIT:新インターフェース、いくつかの変更

/*
* 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;
}
役に立ちましたか?

解決

これは、編集とのより良いですが、インターフェースはまだ驚くべきことです。私は最初のパラメータ、beginパラメータとしてcパラメータを(の干し草の山のが検索されている)入れたいです (が検索される)は、第2、及びfromパラメータ(検索の開始位置)三。そのためには、APIのかなり大規模なセット全体で慣用的であるように思われる。

他のヒント

のコードは、難解なインタフェースを持っている - 文字列の最後の文字と文字列の長さへのポインタを渡します。それはそれを使用して問題につながるます。

(また、コードがバグを持っている - あなたは、ループの前にsまでのカウントを追加する必要があります。)

開始からの場合は、

、現在のコードは常に、あなたが欲しいものではありませんこれは、開始戻ります。ループの後のコードは、単にリターンNULLにすることができます。そして、代わりに!=ループ条件でから、私は誰かがパラメータの順序をアップミックスするときに、算術オーバーフローをポインタになるそうでないから<始める使用することになります。

始めます

編集:あなたが包括[から、開始]たいので、考え直し上でそれを開始する必要があります<=から

  

私はCの関数を書きました。その 'のような' strchr / strrchrます。

あなたはそれがstrrchr()ようではありませんので、strchr()を改革しようとしました。

  

あなたがそれに任意の欠陥を参照していますか?

はい。いくつか。 : - (

b_strchr()NULLを返すことができるので、

、あなたはprintf()声明に直接それを置くべきではありません。 Deferencing 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は、もはや文字列内の文字を指しているので、

あなたはunpredicable結果を取得するつもりないだ - sは、文字列の先頭の前にメモリを指しています。例として、してみてください。

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

と何が起こるか見ています。

が正常に動作します知っているものの外条件を含めるように使用するテストケースを展開します。あなたが本当にあなたのコードをテストするテストケースの設計を支援するために他の誰かを掲載しています。

  

そして、もっと重要:これは悪い考えです。

学習運動として、絶対にありません。

ただし、この場合には、生産コードのためにあなたが標準strrchr()に付着したほうが良いと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top