使用 fgets 进行子字符串搜索

时间:2021-02-06 21:57:09

标签: c

此代码返回子字符串位置,但我担心 gets 被弃用,我应该使用 fgets 但我真的不明白如何将它与指针一起使用,原因我已经尝试对 fgets 使用 gets 格式,但我收到编译器警告。

这个是功能性的:

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

int main() {
    char str[100];
    char str2[100];
    char *pch;

    gets(str);
    gets(str2);

    pch = strstr(str, str2);

    if (pch != NULL)
        printf ("%d\n", pch - str);

    return 0;
}

这就是我使用 fgets 的方式:

fgets(str, 100, pch);
fgets(str2, 100, pch);

1 个答案:

答案 0 :(得分:2)

gets() 已被弃用,因为它不使用大小参数来指定从 stdin 流读取的最大字节数。足够长的输入行将导致未定义的行为,因为 gets() 将写入超出目标数组的末尾:这被认为是一个主要的安全缺陷,因此该函数最终已从 C 标准的最新版本(来自 C11 )。请勿使用此功能。

fgets() 应该用作替代:您的错误是第三个参数是输入流,在您的情况下为 stdin。编译器抱怨 pch 的类型错误。

请注意,与 gets() 不同,fgets() 将换行符存储在缓冲区的末尾,大小允许,因此您必须在测试它是否存在于第一个字符串中之前将其从第二个字符串中删除。

另请注意,pch - str 的类型 ptrdiff_t 可能与 int 不同且更大,您必须将其强制转换为 (int) 作为 printf 参数%d,或在 C99 兼容系统上使用 %td

这是一个简单的方法:

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

int main() {
    char str[100];
    char str2[100];
    char *pch;

    // read 2 strings from stdin:
    // fgets takes an array, its size and a stream as arguments
    // it returns a pointer to the destination array if successful
    // it returns NULL at end of file or upon a read error.
    if (!fgets(str, sizeof str, stdin))
        return 1;

    if (!fgets(str2, sizeof str2, stdin))
        return 1;

    str2[strcspn(str2, "\n")] = '\0';  // strip the trailing newline if any

    pch = strstr(str, str2);

    if (pch != NULL) {
        printf("%d\n", (int)(pch - str));
    }
    return 0;
}
相关问题