首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请高手帮忙实现一个算法?该如何解决

2012-05-27 
请高手帮忙实现一个算法???请实现一个函数,在string中查找某指定字符,如果发现就在该字符前面马上添加另外

请高手帮忙实现一个算法???
请实现一个函数,在string中查找某指定字符,如果发现就在该字符前面马上添加另外一个指定字符, 函数原型如下

void insert(char* strSrc, char cToFind, char cToInert);


调用代码片如下:

#define MAXLEN 100

char c1= "a";
char c2 = "b";
char* strSrc= (char *)malloc(MAXLEN);
/* 上面是初始化strSre的code, 不列出来了,假设初始化之后strSre="I am a 

student", 初始化之后strSre的length不会超过MAXLEN, 但是可能是空字符串*/

insert(strSrc, c1,c2);
/* 现在strSre应该是“i bam ba student."; 

我自己基本实现了,但是代码很臃肿,而且还有bug.
请高手写个好点的算法,谢谢!

[解决办法]
我把你的原型改成:char *insert(char* strSrc, char cToFind, char cToInert);
[解决办法]
void insert(char* strSrc,char cToFind,char cToInsert)
{
char *cur=strchr(strSrc,cToFind);
int n;
if(*cur)
{
n=strlen(cur);
memmove(cur+1,cur,n+1);
*cur=cToInsert;
}
else 
{
*cur++=cToInsert;
*cur='\0';
}

[解决办法]
编译器问题?我在VC6.0下也没问题啊
[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>char *Insert(char *strSrc, char cToFind, char cToInert);int main(){    char str[50] = "I am a student";    char c1 = 'a', c2 = 'b';    printf("%s\n", Insert(str, c1, c2));    return 0;}/*说明:这里类似于库函数strcat,strSrc需要有足够的空间容纳插入后形成的新串*/char *Insert(char *strSrc, char cToFind, char cToInert){    char *p, *q, *temp;    temp = (char *)malloc(strlen(strSrc) * 2 * sizeof(char));    if (temp == NULL)        return strSrc;    for (p = strSrc, q = temp; *p != '\0'; ++p)    {        if (*p == cToFind)            *q++ = cToInert;        *q++ = *p;    }    *q = '\0';    for (q = temp, p = strSrc; *q != '\0'; )        *p++ = *q++;    free(temp);    return strSrc;}
[解决办法]
sorry,答错了。。
探讨
编译器问题?我在VC6.0下也没问题啊

[解决办法]
2L的只能插入一个
[解决办法]
突然发现LZ有一个拼写错误
cToInert
[解决办法]
改一下
C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>char *Insert(char *strSrc, char cToFind, char cToInert);int main(){    char str[50] = "aaaaaaaaaaaaaaaaaaaa";    char c1 = 'a', c2 = 'b';    printf("%s\n", Insert(str, c1, c2));    return 0;}/*说明:这里类似于库函数strcat,strSrc需要有足够的空间容纳插入后形成的新串考虑最坏情况,即strSrc串中的所有字符都是cToFind此时需要辅助空间最多,为strlen(strSrc) * 2 + 1(最后一个'\0')*/char *Insert(char *strSrc, char cToFind, char cToInsert){    char *p, *q, *temp;    temp = (char *)malloc(sizeof(char) * (strlen(strSrc) * 2 + 1));    if (temp == NULL)        return strSrc;    for (p = strSrc, q = temp; *p != '\0'; ++p)    {        if (*p == cToFind)            *q++ = cToInsert;        *q++ = *p;    }    *q = '\0';    for (q = temp, p = strSrc; *q != '\0'; )        *p++ = *q++;    free(temp);    return strSrc;}
[解决办法]
探讨

2L的只能插入一个

[解决办法]
void inserthahaha(char* strSrc, char cToFind, char cToInert)
{
unsigned int len = strlen(strSrc)+1;
unsigned int insert = 0;


char *str1 = (char*)malloc(len*sizeof(char));
char *str2 = (char*)malloc((len+1)*sizeof(char));
memset(str1, 0, len*sizeof(char));
memset(str2, 0, (len+1)*sizeof(char));
strcpy(str1, strSrc);
char *p = str1;
while(*p)
{
if(*p == cToFind)
{
memcpy(str2, str1, insert); 
str2[insert] = cToInert;
strcat(str2, p);
break;
}
p++;
insert++;
}
memset(strSrc, 0, len);
strcpy(strSrc, str2);
free(str1);
free(str2);
str1=NULL;
str2 = NULL;
}
[解决办法]

探讨

改一下
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *Insert(char *strSrc, char cToFind, char cToInert);

int main()
{
char str[50] = "aaaaaaaaaaaaaaaaaaaa";
char……

[解决办法]
C/C++ code
char* insert (const char* str_source, char c_search, char c_insert ){    int find    = 0;    int i        = 0;    int length    = 0;    char* ais    = NULL;    length = strlen(str_source);    for(i = 0; i < length; i++)        if(str_source[i] == c_search)find++;    ais = (char*)malloc((length + find + 1)*sizeof(char));    for(find = 0, i = 0; i <= length; i++)    {        if(str_source[i] == c_search)ais[i + find++] = c_insert;        ais[i + find] = str_source[i];    }    return ais;}
[解决办法]
C/C++ code
#include <stdio.h>#include <string.h>#include <malloc.h>char* insert (const char* str_source, char c_search, char c_insert ){    int find, i, length;    char* ais = NULL;    if(NULL == str_source)return (NULL);    length = (int)strlen(str_source);    for(find = 0, i = 0; i <  length; i++)        if(str_source[i] == c_search)find++;    ais = (char*)malloc((length + find + 1)*sizeof(char));    if(NULL == ais)return (ais);    for(find = 0, i = 0; i <= length; i++)    {        if(str_source[i] == c_search)ais[i + find++] = c_insert;        ais[i + find] = str_source[i];    }    return ais;}int main(){    char* demo = "I am a strudent.aaaaaaaaaa";    char* test = insert(demo, 'a', 'd');    printf(test);    free(test);    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>#include <malloc.h>char* insert (const char* str_source, char c_search, char c_insert ){    int find = 0, i, length = 0;    char* ais = NULL;    if(NULL == str_source)return (NULL);    while (str_source[length])        if(str_source[length++] == c_search)find++;    ais = (char*)malloc((length + find + 1)*sizeof(char));    if(NULL == ais)return (ais);    for(find = 0, i = 0; i <= length; i++)    {        if(str_source[i] == c_search)ais[i + find++] = c_insert;        ais[i + find] = str_source[i];    }    return ais;}int main(){    char* demo = "a I am a strudent. a";    char* test = insert(demo, 'a', 'b');    printf("%s\n",test);    free(test);    return 0;}
[解决办法]
呵呵,换个马甲再上来发。
[解决办法]
释放现有的strSrc不妥,因为你不能确定strSrc是在堆上还是栈上
考虑到char *strcat(char *str1, const char *str2)也是这样要求的,我才这样写

探讨

引用:

改一下
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *Insert(char *strSrc, char cToFind, char cToInert);



int main()
{
char str[50] = "aaaaaaaaaaa……


[解决办法]
探讨

释放现有的strSrc不妥,因为你不能确定strSrc是在堆上还是栈上
考虑到char *strcat(char *str1, const char *str2)也是这样要求的,我才这样写

引用:

引用:

改一下
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include ……

[解决办法]
strcat,乃至strcpy函数,本身都是不安全的。个人认为,指针溢出比内存泄漏的危害要大,两者权衡取其轻。

热点排行