0

私は自分の興味から、いくつかの文字列操作関数に取り組んでいます。ただし、将来のコードでこれらの関数を使用したいと思うかもしれません。文字列内に部分文字列が存在するかどうかを確認するために、次のように記述しました。しかし、私は問題に遭遇しました。私のプログラムは両方の文字列の各文字を比較しますが、文字の順序が正しくないという問題がありました。説明には長い時間がかかるので、例を挙げましょう。

文字列「fooobar」に「oobar」が存在するかどうかを確認すると、文字「o」の最初のインスタンスでトリップするため、プログラムでサブ文字列の場所を見つけるのに問題が発生します。これに対する回避策を開発しましたが、それが問題です。これは回避策であり、実際には確実な解決策ではありません。だから私は誰かが次のコードをどのように改善するか教えてもらえないかと思っていました(私は追加のライブラリを使用したくないことを覚えておいてください):

int chksbstr(char *str, char *sbstr)
{
    int i, sbstrlen, strlen, p = 0;

for(i = 0; sbstr[i] != '\0'; i++);
sbstrlen = i;
for(i = 0; str[i] != '\0'; i++);
strlen = i;
if(sbstrlen > strlen)
{
    printf("\n**Error substring is larger than base string!");
    return 2;
}
if(sbstrlen == strlen)
{
    if(str == sbstr) return 0;
    else return 1;
}
for(i = 0; i <= strlen; i++)
{
    if(str[i] == sbstr[p]) p++;
    else if(str[i] != str[i - 1]) p = 0;
    if(p == sbstrlen) return 0;
}
return 1;
}
4

2 に答える 2

4

23 行少ない:

if (strstr(baseString, subString) != NULL)
{
    /* contains */
}
于 2012-08-10T12:21:06.557 に答える
1

再帰はこれをより良くすることができます。ああ、ちなみに、説明的な識別子の方がはるかに優れています。すべての母音をランダムに削除する理由はありません。忘れないでくださいconst

int check_substring(const char* str, const char* to_go, const char* substr) {
    if (*to_go == '\0') return 1; // Hit all
    if (*str == '\0') return 0; // Ran out of string to check
    if (*str == *to_go) return check_substring(str + 1, to_go + 1, substr);
    else {
        if (*str == *substr)
            return check_substring(str + 1, substr + 1, substr);
        else
            return check_substring(str + 1, substr, substr);
    }
}
int does_contain_substring(const char* str, const char* sbstr) {
    return check_substring(str, sbstr, sbstr);
}
于 2012-08-10T12:52:01.277 に答える