0

文字列が別の文字列内で繰り返される回数をカウントするコードを作成しようとしています。(もっと簡単な方法があれば教えてください。)

これが私が今持っているコードです:

int getStringLenght (char str[]) {
    int lenghtOfTheString;
    int i;
    for (i = 0; i < 100; i++) {
        if(str[i] == '\0') {
            lenghtOfTheString = i;
            break;
        }
    }
    return lenghtOfTheString;
}
int main()
{
    printf("Type a string: ");
    char T[1024];
    scanf("%s",&T);
    char P[100];
    printf("Type a substring: ");
    scanf("%s",&P);
    printf("%s",P);
    int stringSize = getStringLenght (P);
    int occurences = 0;
    int i;
    for (i = 0; i < 10; i++) {
        int j;

        if(T[i] == P[0]) {
            for (j = 0;j<10;j++) {
                char c1 = T[i+j];
                char c2 = P[j];
                if(c1 != c2) {

                    break;
                }
                if(j == stringSize-1) {
                    occurences++;
                    //printf("string iguais em i = %d",i);
                }
            }
        }
    }
    printf("\nThe substring %s was found %d times", P, occurences);

    return 0;
}

アプリがコンパイルされます。たとえば、最初に「バナナ」と入力scanfし、2 番目に「な」と入力すると、アプリは正しい答えを出します。しかし、最初に「バナナとミルク」と入力すると、「バナナとミルク」以外は何も入力しなくてもscanf、2 番目は自動的に「and」と解釈されます。scanfENTER

何が起こっていますか?

4

4 に答える 4

4

scanfの「%s」変換では、空白(スペース、改行、タブなど)が検出されるまで文字のみが読み取られます。複数の単語を入力すると、最初の単語が読み取られます。2番目の呼び出しは2番目を読み取り、以下同様に続きます。

行全体を読みたい場合は、通常はfgets代わりに使用します(scanf同様に機能しますが、少し注意が必要で、多くの人が気付かない機能を使用しているため、理解しにくいことがよくあります)。

于 2012-06-25T23:41:32.817 に答える
1

あなたはscanfがどのように機能するかを理解していません。http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ %sは、空白で終了する1つの文字列のみを読み取ります。文字列を読み続けたい場合、または行を読みたい場合は、文字列の1つが新しい行またはEOFで終わるまで、scanfを使い続けるか、などの別の関数を使用する必要がありますfgets

于 2012-06-25T23:42:21.423 に答える
0

多くの機能がすでに実装されていることを覚えておく必要があります。getStringLengthこれが、あなたの(名前にタイプミスがある)が不要な理由です。strlen関数 fromを使用して、文字列の長さを簡単に確認できますstring.h。さらに、このファイルをインポートするとstrstr、文字列内の特定の部分文字列の最初の出現を見つける関数にもアクセスできます。車輪を再発明する代わりにそれらを使用してみてください ;)

于 2012-06-25T23:52:18.217 に答える
0

これは の標準的な問題scanfです。これを修正するには、次の 3 つの方法があります。


1: 各 scanf の後に fflush を呼び出します。

scanf("%s", some_string); // you don't need to write &some_string because giving a array to a function automatically converts it to a pointer
fflush(stdin);

fflush()すべてのシステムで利用できるわけではありません。


2: scanf をループに入れる:

do
    scanf("%s", somestring);
while (getchar() != '\n');

3: scanf を使わないでください! fgets と sscanf を使用してください。

char buffer[100]; // buffer for fgets()
fgets(buffer, 100, stdin); // read a line from stdin (standart input) into buffer
sscanf(buffer, "%s", some_string); // convert buffer in any format you want
于 2012-06-26T16:11:52.077 に答える