0

プログラムは、ユーザーが希望する任意の入力 (この場合は a と b の文字列のみ) を「*」で終了するものとして読み込む必要があります。次に、検索する部分文字列 (この場合は「baab」) をユーザーに入力するように求めます。部分文字列が見つかった場合、プログラムは「はい」を示し、見つからない場合は「いいえ」を示します。組み込みのマッチング ユーティリティを使用することは許可されておらず、一度に 1 文字ずつ読み取る必要がありました。

gets() を scanf に置き換えたところ、部分文字列を入力して一致していると確信しても、まだいいえと表示されますか?

#include<stdio.h>
#include<string.h>
int search(char[], char[]);

int main()
{
    char a[100], b[40];
    int loc;

    printf("Enter the main string :");
    scanf("%s", a);
    printf("Enter the search string :");
    scanf("%s", b);

    loc = search(a, b);

    if (loc == -1)
        printf("No");
    else
        printf("Yes %d", loc + 1);

    return (0);
}

int search(char a[], char b[])
{
    int i, j, firstOcc;

    i = 0, j = 0;

    while (a[i] != '*')
    {
        while (a[i] != b[0] && a[i] != '*')
            i++;
        if (a[i] == '*')
            return (-1);

        firstOcc = i;

        while (a[i] == b[j] && a[i] != '*' && b[j] != '*')
        {
            i++;
            j++;
        }

        if (b[j] == '*')
            return (firstOcc);
        if (a[i] == '*')
            return (-1);

        i = firstOcc + 1;
        j = 0;
    }
}
4

1 に答える 1

0

2 番目の文字列も a で終了する必要があります。そう*すれば、適切に一致します。そのままでは、コードは「1文字が多すぎます」と一致し続けます-b一致しない文字列の最後に「\ 0」が見つかります。

b 文字列の最後にアスタリスクを付けたくない場合は、それを期待するコードを記述してはなりません...次のようにコードを変更できます (printf何が起こっているかを確認できるように、十分なステートメントを入れました) )。gets注 -演習として修正を残しました。本当に、お願いします。修理する。

include <stdio.h>

int search(char a[], char b[]);

int main()
{
    char a[100], b[40];
    int loc;

    printf("Enter the main string terminated with '*':");
    gets(a); // please don't...

    printf("Enter the search string :");
    gets(b);

    loc = search(a, b);

    if (loc == -1)
        printf("No");
    else
        printf("Yes %d", loc + 1);

    return (0);
}

int search(char a[], char b[])
{
    int i = 0, j = 0, lenB, firstOcc;

    for(lenB=0; b[lenB]!='\0';lenB++);

    printf("a is %s\n", a);
    while (a[i] != '*')
    {
        printf("i = %d\n", i);
        while (a[i] != b[0] && a[i] != '*')
            i++;
        if (a[i] == '*')
            return (-1);
        printf("matching a[i]=%c and b[0]=%c\n", a[i], b[0]);

        firstOcc = i;

        while (a[i] == b[j] && a[i] != '*' && j < lenB)
        {
            printf("a[%d] matches b[%d]\n", i, j);
            i++;
            j++;
        }

        if (j == lenB)
            return (firstOcc);
        if (a[i] == '*')
            return (-1);

        i = firstOcc + 1;
        j = 0;
        printf("going to take another look with i=%d and j=%d\n", i, j);
    }
}
于 2013-10-16T02:50:50.410 に答える