簡體   English   中英

在不使用string.h庫的情況下在字符串中搜索“好”

[英]Searching a string for 'good' without using the string.h library

C編程語言。 問題集中在函數和遞歸上。 問題只是檢查行是否包含“ good”,而不考慮大小寫。 它編譯並匹配樣本輸出,但是檢查軟件將其標記為錯誤。

#include<stdio.h>
#include<stdlib.h> 

int checkString(char string[])
{
    for(int i = 0; i<80; i++)
    {
        if(string[i] == 103 || string[i] == 71 && string[i+1] == 111 || string[i+1] == 79 && string[i+2] == 111 || string[i+1] == 79 && string[i+3] == 100 || string[i+1] == 68)
        {
            return 1;
            break;
        }
    }
}

int goodCheck()
{
    char string[80] = {'0'};
    fgets(string, 80, stdin);
    if(checkString(string)==1)
        {
            return 3;
        }
    else 
        {
            return 0;
        }
}

int main()
{
    int cases = 0;
    char string[80];
    scanf("%d", &cases);
    fflush(stdin);  
    for(int i = 1; i<=cases; i++)
    {
        if (goodCheck() == 3)
        {
            printf("Case #%d: yes\n", i);
        }
        else
        {
            printf("Case #%d: no\n", i);
        }
    }
}

編輯:這是代碼發布修訂,盡管它仍然被標記為錯誤,它的評分比以前更好。

#include<stdio.h>
#include<stdlib.h> 

int checkString(char string[]);

void goodCheck(int i);

int main()
{
    int cases = 0;
    char string[80];
    scanf("%d\n", &cases);
    for(int i = 1; i<=cases; i++)
    {
        goodCheck(i);
    }   
}

int checkString(char string[])
{
    for(int i = 0; i<80; i++)
    {
        if((string[i] == 'g' || string[i] == 'G') && 
        (string[i+1] == 'o' || string[i+1] == 'O') && 
        (string[i+2] == 'o' || string[i+2] == 'O') && 
        (string[i+3] == 'd' || string[i+3] == 'D'))
    {
        return 1;
    }
    }
}

void goodCheck(int i)
{
    char string[80] = {'0'};
    fgets(string, 80, stdin);
    if(checkString(string)==1)
    {
        printf("Case #%d: yes\n", i);
    }
    else 
    {
        printf("Case #%d: no\n", i);
    }
}

&&的運算符優先級高於||。 所以你的代碼正在檢查

   string[i] == 'g'
|| (string [i] == 'G' && string [i+1] == 'o')
|| (string [i+1] == 'O' && string [i+2] == 'o')
|| (string [i+2] == 'O' && string [i+3] == 'd')
|| string [i+3] == 'D'

所有以“ g”開頭,以“ Go”開頭,或包含“ Oo”或“ Od”或以“ D”結尾的子字符串都將通過檢查。 就像“高飛”會過去,還是“噢,我的天!”。

“ good”的所有變體都可以通過,但是許多不正確的字符串也可以通過。 似乎您尚未使用包含一些但不是所有“ good”字符的字符串來測試此字符串。 甚至“ Lady Gaga通過測試”也通過了測試(因為一個小寫的g)。

字符串搜索問題可以通過有限自動機解決:


int checkString(char *string)
{
int pos,state;

for(pos=state=0; string[pos]; pos++) {
        switch(string[pos]) {
        case 'G':
        case 'g': if (state++ == 0) continue;
                break;
        case 'O':
        case 'o': if (state++ == 1 || state == 3) continue;
                break;
        case 'D':
        case 'd': if (state == 3) return pos-state; // Got it!
        default:break;
                }
        state=0;
        }
return -1; // Failed
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM