请高手帮忙实现一个算法???
请实现一个函数,在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,答错了。。
[解决办法]
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;}
[解决办法]
[解决办法]
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
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)也是这样要求的,我才这样写
[解决办法]
[解决办法]
strcat,乃至strcpy函数,本身都是不安全的。个人认为,指针溢出比内存泄漏的危害要大,两者权衡取其轻。