c - 不使用库函数在字符串中查找子字符串

标签 c

下面是代码模板,在/* write your code here */下是我自己的代码。 模板应该是正确的,但我的代码有问题。

我的算法是遍历 str 直到找到空字符。 然后比较每个字符,如果相同则遍历str和sub,否则set继续遍历str并重置为substr的第一个字符。

#include <stdio.h>
int findSubstring(char *str, char *substring);
int main()
{
    char str[40], substr[40];
    printf("Enter the string: ");
    gets(str);
    printf("Enter the substring: ");
    gets(substr);
    printf("findSubstring(): %d\n", findSubstring(str, substr));
    return 0;
}
int findSubstring(char *str, char *substr)
{
    /* write your code here */
    int i = 0, j = 0;
    while ((str[j] != '\0')||(substr[i] != '\0')) {
        if (substr[i] != str[j]) {
            j++;
            i = 0;
        }
        else {
            i++;
            j++;
        }
    }
    if (substr[i] == '\0')
        return 1;
    else
        return -1;
}

最佳答案

  • 不要使用 gets(),它有不可避免的缓冲区溢出风险。
  • 循环条件错误。如果 *(str + j)*(substr + i) 之一是(终止)空字符,则循环应该退出。

固定代码:

#include <stdio.h>
int findSubstring(char *str, char *substring);
void safer_gets(char *str, size_t max);
int main(void)
{
    char str[40], substr[40];
    printf("Enter the string: ");
    safer_gets(str, sizeof(str));
    printf("Enter the substring: ");
    safer_gets(substr, sizeof(str));
    printf("findSubstring(): %d\n", findSubstring(str, substr));
    return 0;
}
int findSubstring(char *str, char *substr)
{
    int i = 0, j = 0;
    while ((*(str + j) != '\0')&&(*(substr + i) != '\0')) {
        if (*(substr + i) != *(str + j)) {
            j++;
            i = 0;
        }
        else {
            i++;
            j++;
        }
    }
    if (*(substr + i) == '\0')
        return 1;
    else
        return -1;
}
void safer_gets(char *str, size_t max)
{
    int i;
    fgets(str, max, stdin);
    for (i = 0; *(str + i) != '\0'; i++) {
        if (*(str + i) == '\n') {
            *(str + i) = '\0';
            break;
        }
    }
}

关于c - 不使用库函数在字符串中查找子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35631422/

相关文章:

c - 删除前未知删除节点的双向链表

c - 为什么不强制在函数定义中为函数参数提及 `int` 数据类型?

c - C 中 realloc 的问题

objective-c - Cocoa API 的 C 绑定(bind)?

c++ - CS_HREDRAW | CS_VREDRAW 有什么作用?

计算均值中位数模式c编程数组

java - 使用 Android NDK 创建并显示弹出窗口?

c - 内存操作 : set every n-th bit (C/C++) in modern CPUs/GPUs

在函数中使用 const 参数的 C 编程

c - 理解C中if、else if、else的控制流