[英]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.