C 程序返回意外输出

问题描述 投票:0回答:3

此代码应该确定一个单词是否出现在句子中。我尝试输入 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");
}
c loops substring c-strings function-definition
3个回答
0
投票

仔细看看:

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;


0
投票

看起来您正在尝试同时 (a) 遍历字符串,测试每个字符是否是单词的开头 (

k==1 || *(sen-1)==' '
),以及 (b) 测试每个字符以查看它是否等于
i
-搜索词的第一个字母。这两个目标是冲突的,因为单词的第二个字符永远不会满足第一个测试(它不会是单词的开头)。当你找到一个单词开始时,你应该重置
i
,但是检查每个字符,而不仅仅是开始单词的字符。


0
投票

对于根据 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
© www.soinside.com 2019 - 2024. All rights reserved.