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

时间:2016-02-25 15:23:50

标签: c

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

我的算法是迭代str直到找到空字符。 然后比较每个字符,如果它们相同则迭代str和sub,否则设置继续迭代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;
}

3 个答案:

答案 0 :(得分:5)

  • 不要使用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;
        }
    }
}

答案 1 :(得分:0)

#include<stdio.h>
#include<conio.h>
void main()
{
    char s[100],sub[50];
    int i,j,c=0;
    clrscr();
    printf("enter string and substring\n");
    gets(s);
    printf("\n");
    gets(sub);
    printf("\n");
    i=0;
    j=0;
    while(s[i]!='\0')
    {
        if(s[i]!=sub[j])
            i++;
        else if(s[i]==sub[j])
        {
            while(sub[j]!='\0')
            {
                if(s[i]==sub[j])
                {
                    i++;
                    j++;
                    c++;
                }
                else
                {
                    c=0;
                    break;
                }
            }
        }
    }
     if(c!=0)
     printf("\nsubstring  is present \n ");
     else
     printf("\nsubstring  is absent \n ");
    getch();
}

答案 2 :(得分:0)

/ * --------------------------一个更简单的示例--------------- --------------

从包含给定子字符串的一组单词中查找单词?

输入:一组单词:[blackcat,blackdog,blackrat,whitetiger,blueelephant],

子字符串:黑色

输出:[黑猫,黑狗,黑鼠]

--------------------------------------------------- ------------------------------------------ * /

#include <iostream>
#include <cstring>
int substring(char* sub,char* string);
int main()
{
    const char* Names[] { "blackcat", "blackdog", "blackrat", "whitetiger", "blueelephant" };
    char substr[]{ "black" };
    int found{ -1 };
    for (auto strings: Names)
    {
        found = substring(substr, const_cast<char*>(strings));
        if (found != -1) {
            std::cout << strings  << " ";
        }
    }
    std::cout << std::endl;
    return 0;
}

int substring(char* sub, char* string)
{
    int i{};
    int j{};
    while ((string[i] != '\0') && (sub[j] != '\0'))
    {
        if (string[i] != sub[j]) {
            j++;
            i = 0;
        }
        else {
            i++;
            j++;
        }
    }
    if (sub[j] == '\0' && i != 0) {
        return 1;
    }
    else {
        return -1;
    }
}