0

重複の可能性:
strstr の逆 fn() はありますか

2 つの文字列を取得し、最初の文字列内に 2 番目の文字列が存在するかどうかを確認し、最も右のインデックスの出現場所を返すこの main 関数と関数を作成しました。見つからなかった場合は return -1.

これは私が書いたコードです:

#include <stdio.h>

int strindex(char[], char[]);

int main()
{
    char a[100];
    char b[100];
    int search;
    printf("Enter two strings, To search the second one in the first one:\n");
    printf("Enter the first string to search in:\n");
    fgets(a,100,stdin);
    printf("Enter the second string to search in the first:\n");
    fgets(b,100,stdin);
    printf("\n\n THE FIRST STRING IS:%s\n\n THE SEARCH STRING IS:%s",a, b);
    printf("\n\n");
    search = strindex(a, b);
    if(search==-1)
        printf("The second String didnt found in the first string\n");
    else printf("The second string appear in the first string at most right at index:%d\n",search);
    return 0;
}


int strindex(char s[], char t[])
{
    int foundIndex = -1;
    int tempFound, startNext;
    int i,j;
    i = j = 0;
    while (s[i]!='\0')
    {
        if(s[i]==t[j])
        {
            startNext = i+1;
            tempFound = i;
            while(s[i]!='\0' && t[j]!='\0' && s[i]==t[j])
                i++,j++;
            if (t[j]=='\0') /**check if it null**/
            {
                printf("found match");
                foundIndex = tempFound;
            }
            i = startNext;
            j = 0;
        }
        else i++;
    }
    return foundIndex;
}

この行に問題があると思います:

if (t[j]=='\0') /**check if it null**/

2番目の文字列に含まれる2つの文字列を最初の文字列に入れてみましたが、t[j]nullに等しいにもかかわらず、内部のifステートメントを実行しません。

  • このプログラムを書くには他にも多くの方法があることを知っています。しかし、これも機能するはずであり、機能させようとしています。
4

2 に答える 2

0

OKフレンズ。これはうまくいく解決策です:-): Olaf Dietscheに感謝します

#include <stdio.h>

int strindex(char[], char[]);

int main()
{
    char a[100];
    char b[100];
    int search;
    printf("Enter two strings, To search the second one in the first one:\n");
    printf("Enter the first string to search in:\n");
    fgets(a,100,stdin);
    printf("Enter the second string to search in the first:\n");
    fgets(b,100,stdin);
    printf("\n\n THE FIRST STRING IS:%s\n\n THE SEARCH STRING IS:%s",a, b);
    printf("\n\n");
    search = strindex(a, b);
    if(search==-1)
        printf("The second String didnt found in the first string\n");
    else printf("The second string appear in the first string at most right at index:%d\n",search);
    return 0;
}


int strindex(char s[], char t[])
{
    int foundIndex = -1;
    int tempFound, startNext;
    int i,j;
    i = j = 0;
    while (s[i]!='\n')
    {
        if(s[i]==t[j])
        {
            startNext = i+1;
            tempFound = i;
            while(s[i]!='\n' && t[j]!='\n' && s[i]==t[j])
                i++,j++;
            if (t[j]=='\n')
                foundIndex = tempFound;
            i = startNext;
            j = 0;
        }
        else i++;
    }
    return foundIndex;
}
于 2012-12-09T17:59:12.273 に答える
0

あなたはインデックスをジャグリングしていますが、これはかなり混乱しています。インデックスは 1 つの目的にのみ使用し、自由に設定およびリセットしないでください。関数を少し書き直して、使用されているインデックスをクリーンアップすることをお勧めします

int strindex(char s[], char t[])
{
    int foundIndex = -1;
    int i,j;
    for (i = 0; s[i]!='\0'; i++)
    {
        if(s[i]==t[0])
        {
            for(j = 1; s[i + j]!='\0' && t[j]!='\0' && s[i + j]==t[j]; j++)
                ;

            if (t[j]=='\0') /**check if it null**/
            {
                printf("found match");
                foundIndex = i;
            }
        }
    }

    return foundIndex;
}

もちろん、内側のループを置き換えることができますstrncmp

そして今、あなたの質問に;-)。意図strindexしたとおりに動作します。@wildplasser が既に述べたようにfgets、最後の改行\nをバッファーに格納します。検索する文字列には最後以外に改行がないため、検索する文字列が最後ではなく途中にある場合、一致することはありません。

とから改行を削除するa[]b[]、strindex が機能することがわかります。別のアプローチとして、fgets で読み取る代わりに、コマンド ラインで文字列を指定することもできます。

int main(int argc, char **argv)
{
    int search;
    printf("\n\n THE FIRST STRING IS:%s\n\n THE SEARCH STRING IS:%s", argv[1], argv[2]);
    printf("\n\n");
    search = strindex(argv[1], argv[2]);
    if(search==-1)
        printf("The second String didnt found in the first string\n");
    else printf("The second string appear in the first string at most right at index:%d\n",search);
    return 0;
}
于 2012-12-09T14:07:47.557 に答える