读书人

这个删除串S中所有与串T相同的子串的程

发布时间: 2012-08-01 17:53:40 作者: rapoo

这个删除串S中所有与串T相同的子串的程序中,我调试到SubString中的str1[i] = str2[j];时,就有错了。。
程序直接停止工作了,不知道问题在哪里?
#include <stdio.h>
#include <string.h>

int StrCompare (char * str1, char * str2) //比较str1和str2的大小
{
while (* str1 && * str2)
{
if (* str1 != * str2) return *str1 - *str2;
str1++; str2++;
}
if (* str1) return 1;
return 0;
}

void StrDelete (char * S, int pos, int len) //删除pos个字符起长度为len的子串
{
int i, j;
for (i = pos, j = pos + len; j < strlen (S); i++, j++)
S[i] = S[j];
S[i] = '\0';
}

int SubString (char * str1, char * str2, int pos, int len) //用str1返回str2中的第pos个字符起长度为len的子串
{
int i, j;
if (pos < 0 || pos > strlen (str2) - 1 || len < 0 || len > strlen (str2) - pos)
return 0;
for (i = 0, j = pos; i < len; i++, j++)
str1[i] = str2[j]; //这个地方报错
str1[i] = '\0';
return 1;
}

void DeleteSame (char *S, char * T) //删除串S中所有与串T相同的子串
{
int i, m ,n;
char * Sub = NULL;
m = strlen (S);
n = strlen (T);
for (i = 0; i < m; )
{
SubString (Sub, S, i, n);
if (StrCompare (Sub, T) != 0) i++;
else {
StrDelete (S, i, n);
i += n;
}
}
}

int main(void)
{
char str1[] = "abcdefabc";
char str2[] = "cd";
DeleteSame (str1, str2);
puts (str1);
return 0;
}

[解决办法]
str1未分配内存
[解决办法]
char * Sub = NULL; 没空间啊
把sub申明成一个足够长的数组吧,
没仔细看,根据需要,最好初始化成全'\0'
[解决办法]
单步调试和设断点调试是程序员必须掌握的技能之一。

读书人网 >C语言

热点推荐