我使用这段代码来确定字符串中是否存在子字符串.但是,即使字符串中不存在子字符串,结果也是Present.基本上,我得到了Present分作为唯一的结果.

#include <stdio.h>
#include <string.h>

int main()
{
    int i, la, lb, j, f = 0, found = 0;
    char a[100], b[100];

    printf("Enter a string: ");
    fgets(a, 100, stdin);

    printf("Enter substring: ");
    fgets(b, 100, stdin);

    la = strlen(a);
    lb = strlen(b);

    for (i = 0;i < la - 2; i++) {
        if (a[i] == b[0]) {
            for (j = 0; j < lb - 2; j++) {
                f = 0;
                if (a[i + j] != b[j]) {
                    f = 1;
                    break;
                }
            }
        }
        if (f == 0) {
            found = 1;
            break;
        }
    }

    if (found == 1) {
        printf("Present.");
    } else {
        printf("Not Present.");
    }

    return 0;
}

推荐答案

您应该首先从用户输入的字符串中go 掉尾随的换行符:

    a[strcspn(a, "\n")] = '\0';
    b[strcspn(b, "\n")] = '\0';

然后,您可以删除for循环测试中的- 2个调整,这些调整是不正确的,因为无论如何您都应该只调整1.

f变量有一个问题:您应该将其设置为0,before嵌套循环,并在嵌套的for循环之后,但在if主体内进行测试.

另一个问题是,您应该只迭代i <= la - lb长的外部循环.

以下是修改后的版本:

#include <stdio.h>
#include <string.h>

int main() {
    char a[100], b[100];

    printf("Enter a string: ");
    if (!fgets(a, sizeof a, stdin))
        return 1;

    printf("Enter substring: ");
    if (!fgets(b, sizeof b, stdin))
        return 1;

    // compute the lengths without the trailing newlines.
    size_t la = strcspn(a, "\n");
    size_t lb = strcspn(b, "\n");
    int found = 0;

    if (lb == 0) {
        found = 1;
    } else {
        for (size_t i = 0; i + lb <= la; i++) {
            if (a[i] == b[0]) {
                int f = 0;
                for (size_t j = 1; j < lb; j++) {
                    if (a[i + j] != b[j]) {
                        f = 1;
                        break;
                    }
                }
                if (f == 0) {
                    found = 1;
                    break;
                }
            }
        }
    }
    if (found == 1) {
        printf("Present.\n");
    } else {
        printf("Not Present.\n");
    }
    return 0;
}

如果标准字符串函数strcspn()是禁区,则可以这样计算lalb:

    size_t la = 0, lb = 0;
    while (a[la] != '\n' && a[la] != '\0')
        la++;
    while (b[lb] != '\n' && b[lb] != '\0')
        lb++;

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

为什么PLT表中没有push指令?

增加getaddrinfo返回的IP地址数量

C语言中的strstr问题

如何在ASM中访问C struct 成员

在C++中访问双指针

获取每个循环迭代结束时的当前时间

处理来自浏览器的HTTP请求

可变宏不能编译

将数组插入数组

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

Linux分段故障(核心转储)

STM32 FATFS用户手册(Um1721)中的代码正确吗?

生成的头文件不包括用户定义的文件

如何打印循环调度问题的时间表

分配给静态变量和动态变量的位置之间有区别吗?

为什么这个代码的最后一次迭代不能正常工作?

在哪里可以找到叮当返回码的含义?