当我运行这个程序时,我举例说明了字符串Ana are mere
和子串are
。结果字符串为Ana mereere
,而不是Ana mere
。你能告诉我为什么吗?
#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();
}
答案 0 :(得分:3)
行
sir[i] = '\0'
应该是
sir[j] = '\0'
答案 1 :(得分: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: ");
永远不要使用gets
,而是使用fgets(sir, 255, stdin);
,然后测试返回值。并使用'\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
调用,一个带有输入字符串,一个带有结果字符串。
printf("Sirul %s rezultat dupa stergerea subsirului %s este: %s\n",
sir, subsir, str_rem(sir, subsir));
最后,此调用是非标准的,请改用getchar()
。
_getch();
}
此外,您应该测试subsir
是否为空字符串,您的代码会针对此特殊情况调用未定义的行为。多个匹配呢?您是否应该将它们全部删除或仅在您尝试现在执行时首次删除?