繁体   English   中英

从字符串中删除子字符串

[英]Deleting a substring from a string

当我运行这个程序,我介绍例如作为字符串Ana are mere和子are 结果字符串是Ana mereere ,而不是Ana mere Ana mereere 你能告诉我为什么吗?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
char *str_rem(char *sir, char *subsir) 
{
    int i, j,k;
    int loc = -1; //subsirul nu a fost gasit(presupunem)
    for (i = 0; sir[i] && (loc==-1);i++)
    for (j = i, k = 0; sir[j] == subsir[k];j++,k++)
    if (subsir[k + 1] == 0) loc = i;
    if (loc != -1) //subsirul a fost gasit
    {
        for (k = 0; subsir[k]; k++)
            ; //bucla nu face nimic!! dorim sa obtinem cate elemente are subsirul
        printf("\nSubsirul este format din %d elemente\n", k);
        for (j = loc, i = loc + k; sir[i]; j++, i++)
            sir[j] = sir[i];
        sir[i] = '\0';

    }
    return (sir);
}
void main()
{
    char *sir;
    sir = (char*)malloc(255*sizeof(char));
    printf("Introduceti sirul: ");
    gets(sir);
    char *subsir;
    subsir = (char*)malloc(255 * sizeof(char));
    printf("Introduceti subsirul care doriti sa fie cautat: ");
    gets(subsir);
    printf("Sirul %s rezultat dupa stergerea subsirului %s este: %s\n", sir, subsir, str_rem(sir, subsir));
    _getch();
}

线

sir[i] = '\0'

应该

sir[j] = '\0'

您的代码有很多问题:

您的代码缩进不正确。 我什至会说这是欺骗性的缩进! 请花时间并小心地将代码缩进每级4个空格,并对任何不重要的块使用大括号,这样可以防止许多错误爬入其中。

char *str_rem(char *sir, char *subsir) 
{
    int i, j, k;

使用英语发表评论,将为世界各地的读者提供帮助。 并非所有人都懂罗马尼亚语。

    int loc = -1; //subsirul nu a fost gasit(presupunem)

    for (i = 0; sir[i] && (loc == -1); i++) {

为什么不使用strstr()查找匹配项?

        for (j = i, k = 0; sir[j] == subsir[k]; j++, k++) {
            if (subsir[k + 1] == 0) loc = i;

为什么要进行2次独立测试? 条件是等效的。

            if (loc != -1) { //subsirul a fost gasit

为什么要重新扫描'\\0' k += 1就足够了。

                for (k = 0; subsir[k]; k++) {
                    //bucla nu face nimic!! dorim sa obtinem cate elemente are subsirul
                    continue;  // use this to emphasize the empty body.
                }

                printf("\nSubsirul este format din %d elemente\n", k);
                for (j = loc, i = loc + k; sir[i]; j++, i++) {
                    sir[j] = sir[i];
                }

这是一个错误:您应该设置sir[j]而不是sir[i]

                sir[i] = '\0';

这里的另一个错误:给定代码的编写方式,您应该在这里摆脱循环。 如果您修复了上述其他错误,则循环将继续比较两个字符串的末尾。

            }
        }
    }

删除()return是一条语句,而不是函数调用。

    return (sir);
}

正确的原型应该是int main(void)int main(int argc, char *argv[])

void main()
{

为什么使用malloc而不是定义本地数组char sir[255];

    char *sir;
    sir = (char*)malloc(255*sizeof(char));

    printf("Introduceti sirul: ");

永远不要使用getsfgets(sir, 255, stdin); 而是测试返回值。 并用sir[strcspn(sir, "\\n")] = '\\0'; '\\n' sir[strcspn(sir, "\\n")] = '\\0';

    gets(sir);

与上述相同:使用char subsir[255];

    char *subsir;
    subsir = (char*)malloc(255 * sizeof(char));

    printf("Introduceti subsirul care doriti sa fie cautat: ");

使用fgets(subsir, 255, stdin)subsir[strcspn(subsir, "\\n")] = '\\0';

    gets(subsir);

换行以提高可读性:

这里还有另一个错误:您必须先修改sir然后再由printf打印。 您应该将此行分为对printf 2个单独的调用,一个使用输入字符串,一个使用结果字符串。

    printf("Sirul %s rezultat dupa stergerea subsirului %s este: %s\n", 
           sir, subsir, str_rem(sir, subsir));

最后,此调用是非标准的,请改用getchar()

    _getch();
}

此外,您应该测试subsir是否为空字符串,对于这种特殊情况,您的代码将调用未定义的行为。 还有多场比赛呢? 您应该立即删除它们,还是仅删除第一个?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM