此代码应该确定一个单词是否出现在句子中。我尝试输入 sen:"my name is", search:"name",但它显示未找到。请帮我。谢谢!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
bool s(char *sen, char *search) {
int k=1, i=0;
while (*sen!='\0') {
if (k==1 || *(sen-1)==' ') {
if (*sen==search[i]) {
i++;
if (i==strlen(search) && (*(sen+1)==' ' || *(sen+1)=='\0')) return true;
}
else i=0;
}
k=0;
sen++;
}
return false;
}
void main() {
char sen[100], search[20];
fgets(sen, 100, stdin);
scanf("%s", search);
if (s(sen, search)) printf("Found");
else printf("Not found");
}
仔细看看:
if (k==1 || *(sen-1)==' ') {
我在想这应该检查单词的开头吗?
如果检查失败,这只会是一次。对于单词的开头
试试这个:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
bool s(char *sen, char *search) {
int k=1, i=0;
while (*sen!='\0') {
if (k==1 || *(sen-1)==' ') {
if (*sen==search[i]) {
k = 1;
i++;
if (i==strlen(search) && (*(sen+1)==' ' || *(sen+1)=='\0' || *(sen+1)=='\n')) return true;
}
else{
i=0;
k=0;
}
}
sen++;
}
return false;
}
void main() {
char sen[100], search[20];
fgets(sen, 100, stdin);
scanf("%s", search);
if (s(sen, search)) printf("Found");
else printf("Not found");
}
如果开头不匹配,k 现在只会设置为 0,并且在开头匹配后它将设置为 1。我假设这就是 k 在这里的用途。
此外,您的第一个字符串使用 Enter 键“终止”,因此它们最后一个符号将不是 ' ' 而是 ' ' 对于新行操作:
if (i==strlen(search) && (*(sen+1)==' ' || *(sen+1)=='\0' || *(sen+1)=='\n')) return true;
看起来您正在尝试同时 (a) 遍历字符串,测试每个字符是否是单词的开头 (
k==1 || *(sen-1)==' '
),以及 (b) 测试每个字符以查看它是否等于i
-搜索词的第一个字母。这两个目标是冲突的,因为单词的第二个字符永远不会满足第一个测试(它不会是单词的开头)。当你找到一个单词开始时,你应该重置i
,但是检查每个字符,而不仅仅是开始单词的字符。
对于根据 C 标准的启动器,没有参数的函数
main
应声明为
int main( void )
函数的参数
s
应该用限定符const
来声明
bool s( const char *sen, const char *search );
因为传递的字符串在函数内没有改变。
函数
fgets
可以将新行字符'\n'
追加到输入的字符串中,您应该从字符串中删除它。
if语句之后
if (k==1 || *(sen-1)==' ') {
if (*sen==search[i]) {
i++;
if (i==strlen(search) && (*(sen+1)==' ' || *(sen+1)=='\0')) return true;
}
else i=0;
}
变量
k
设置为0
k=0;
因此 if 语句将仅针对指针
search
指向的字符串的第一个字符执行,该字符与字符串中单词开头的字符 sen
.
如果使用标准的C函数
strstr
,函数看起来会更简单。例如
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
bool s( const char *sen, const char *search )
{
bool found = false;
size_t n = strlen( search );
for ( const char *p = sen; !found && ( p = strstr( p, search ) ) != NULL; p += n )
{
found = ( p == sen || isblank( ( unsigned char )p[-1] ) ) &&
( p[n] == '\0' || isblank( ( unsigned char )p[n] ) );
}
return found;
}
int main( void )
{
char sen[100], search[20];
fgets( sen, sizeof( sen ), stdin );
sen[ strcspn( sen, "\n" ) ] = '\0';
scanf( "%19s", search );
if ( s( sen, search ) ) puts( "Found" );
else puts( "Not found" );
}
程序输出可能看起来像
my name is Dhruv
name
Found