字符的切割与合并

erldy 2006-07-18 11:16:47
两个看起来非常简单的函数,为什么就是有错误呢,搞不懂
第一个切割函数:
例如
char *str = "8058007004";
SplitStr(str,Fstr,Lstr,7);
切割成
Fstr ="8058007"
Lstr ="004"
void
SplitStr(char * str,char * Fstr,char * Lstr,int len){
int mlen = 0;
int i = 0;
char * tmp1,* tmp2;
tmp1 = Fstr;

while((*tmp1++ = *str++)&&i<len-1) i++;
*tmp1 = 0x00;

Lstr = str;

//while((*tmp2++ = *str++)!=0x00) printf("str:%s\n",str);

//printf("Fstr:%s\n",Fstr);
//printf("Lstr:%s\n",Lstr);
}

第二个是合并函数:
例如
JoinStr(strs,"8058007","004");
合成的结果是:strs = "8058007004"
void
JoinStr(char * str,char * Fstr,char * Lstr){
char * tmp;
tmp = str;
printf("Fstr:%s\n",Fstr);
printf("Lstr:%s\n",Lstr);
while((*tmp++ = *Fstr++)!=0x00);
tmp--;
while((*tmp++ = *Lstr++)!=0x00);
printf("str:%s\n",str);
}

两个程序运行都有错误,不知道哪里的问题,请高手指点!!!谢谢了。
...全文
195 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhu_doc 2006-07-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

void JoinStr(char * str,char * Fstr,char * Lstr)
{
str = (char *)malloc((strlen(Fstr)+strlen(Lstr)) * sizeof(char));

strcpy(str,Fstr);
strcat(str,Lstr);
printf("str:%s\n",str);



}


int main()
{
char *strs = NULL;
JoinStr(strs,"8058007","004");
free(strs);
return 0;

}
柯本 2006-07-18
  • 打赏
  • 举报
回复
改一个
SplitStr(char * str,char * Fstr,char * Lstr,int len)
{
strncpy(Fstr,str,len);
Fstr[len]=0;
strcpy(Lstr,str+len);
}
...
char *str = "8058007004";
char Fstr[10],Lstr[10];
SplitStr(str,Fstr,Lstr,7);
chenhu_doc 2006-07-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

void
SplitStr(char * str,char * Fstr,char * Lstr,int cutp )
{
int i = 0;
int lLen = strlen(str) - cutp;

Fstr = (char * )malloc(cutp * sizeof(char));
Lstr = (char * )malloc(lLen * sizeof(char));
for( i = 0; i < 7; i++ )
{
Fstr[i] = str[i];
}
Fstr[i] ='\0';
for( i = 0; i < lLen; i++ )
{
Lstr[i] = str[i+7];
}
Lstr[i] ='\0';

printf("Fstr:%s\n",Fstr);
printf("Lstr:%s\n",Lstr);


}

int main()
{
char *str = "8058007004";
char *Fstr=NULL;
char *Lstr=NULL;
SplitStr(str,Fstr,Lstr,7);

free(Fstr);
free(Lstr);
return 0;

}
chenhu_doc 2006-07-18
  • 打赏
  • 举报
回复
同意keiy!
yingge 2006-07-18
  • 打赏
  • 举报
回复
1.SplitStr函数的前面没有什么问题,后面Lstr = str;这个地方应该改为while(*Lstr++=*str++);

2.JoinStr函数逻辑是正确的。

3.两个函数都有一个问题,没有检查字符数组是否越界,也就是很可能会造成溢出,应设定一个最大长度防止越界访问。
erldy 2006-07-18
  • 打赏
  • 举报
回复
那应该怎样修改呢?
柯本 2006-07-18
  • 打赏
  • 举报
回复
两个程序都有同一问题,就是内存分配,如SplitStr(char * str,char * Fstr,char * Lstr,int len),你没有给char * Fstr,char * Lstr新的空间,而是在原字串上修改,当然有错
erldy 2006-07-18
  • 打赏
  • 举报
回复
谢谢楼上各位高手!!
先试试先
jixingzhong 2006-07-18
  • 打赏
  • 举报
回复
关于 分割:

void SplitStr(char * str,char * Fstr,char * Lstr,int len)
{
printf("str: %s, len = %d\n",str, len);

strncpy(Fstr, str, len); //拷贝前 len 个字符
Fstr[len] = 0x00; //设置终结字符
printf("Fstr: %s\n",Fstr); //输出

strcpy(Lstr, str+len); //从len个字符后,拷贝剩余字符
printf("Lstr: %s\n",Lstr); //输出
}

int main(){
char *str = "8058007004";
char Fstr[20], Lstr[20]; //在这里保证空间足够,否则使用malloc动态分配内存
SplitStr(str,Fstr,Lstr,7); //从第7个字符处分割字符串

system("pause"); //暂停
return 0;
}
jixingzhong 2006-07-18
  • 打赏
  • 举报
回复
关于 分割:

void SplitStr(char * str,char * Fstr,char * Lstr,int len)
{
printf("str: %s, len = %d\n",str, len);

strncpy(Fstr, str, len); //拷贝前 len 个字符
Fstr[len] = 0x00; //设置终结字符
printf("Fstr: %s\n",Fstr); //输出

strcpy(Lstr, str+len); //从len个字符后,拷贝剩余字符
printf("Lstr: %s\n",Lstr); //输出
}

int main(){
char *str = "8058007004";
char Fstr[20], Lstr[20]; //在这里保证空间足够,否则使用malloc动态分配内存
SplitStr(str,Fstr,Lstr,7); //从第7个字符处分割字符串

system("pause"); //暂停
return 0;
}
jixingzhong 2006-07-18
  • 打赏
  • 举报
回复
呵呵, 楼上 老陈 chenhu_doc 的:

void JoinStr(char * str,char * Fstr,char * Lstr)
{
str = (char *)malloc((strlen(Fstr)+strlen(Lstr)) * sizeof(char));
...
如此操作是不可行的,
指针副本被修改指向后,
在实参中是没有任何实际作用的,
除非再把这个 str 返回过去 ...
jixingzhong 2006-07-18
  • 打赏
  • 举报
回复
合并基本没有问题,
在开始前先分配一下空间就可以了 ...

为了获得正确的指针,需要传递 2 级指针,
或者是目标指针 str 已经分配了足够的空间:

JoinStr(char ** str,char * Fstr,char * Lstr) //char *str ==> char **str
{
char * tmp;
*str = (char *)malloc(sizeof(char) * (strlen(Fstr) + strlem(Lstr) +1));
tmp = *str;
printf("Fstr:%s\n",Fstr);
printf("Lstr:%s\n",Lstr);
while((*tmp++ = *Fstr++)!=0x00);
tmp--;
while((*tmp++ = *Lstr++)!=0x00);
printf("str:%s\n",*str); //str ==> *str
}
jixingzhong 2006-07-18
  • 打赏
  • 举报
回复
操作的是 常量字符串,这个是非法的 ....
sakurako 2006-07-18
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <string.h>

void
SplitStr(char* str,char* Fstr,char* Lstr,int len);

void
JoinStr(char * str,char * Fstr,char * Lstr);

int main(int argc, char* argv[])
{
char sz1[100] = {0};
char sz2[100] = {0};
char sz[] = "1254526325235";

SplitStr(sz, sz1, sz2, 6);
return 0;
}


void
SplitStr(char* str,char* Fstr,char* Lstr,int len)
{
memcpy(Fstr, str, (int)strlen(str) > len ? len : strlen(str));
strcpy(Lstr, &str[len]);
}

void
JoinStr(char * str,char * Fstr,char * Lstr)
{
strcpy(str, Fstr);
strcat(str, Lstr);
}
yingge 2006-07-18
  • 打赏
  • 举报
回复
我认为函数中不需要malloc了,不过确实需要检查边界
TXT切割合并器主要是将文件切割成多分,或者将多份文件合并成一个文件,有多种切割方式和多种合并方式。 切割方式: 1、按字节切割:按照字节数来切割,对于切割其它非文本文件来说是不错的选择。如果碰到切割包含汉字的文件时,就会切割整个汉字,而不必担心会有乱码,不过切割出来的文件大小会和你输入的指定字节数有些许偏差。。。。 2、按等份切割:按照输入的等份来,也可以切割非文本文件。碰到含有汉字文件时,也会完整切割整个汉字,而不必担心会有乱码。和上面的区别在于,切割条件不同外,其他都一样。。。。 3、按字串切割:按照输入的字符切割,比如一个文件是 "12345hello my name is neill....切割器hellosdfsdewf",而输入的字串为:"hello",那么将会切割成3份,分别是:"1234","hello my name is neill....切割器","hellosdfsdewf"; 合并方式: 1、按字符合并:把文件里所出现的S字串到E字串之间的字符提取出来合并成一个文件。比如文件一:"吃超人abc变咸蛋789",文件二:"aaaaabc2012789",而S字串为:abc,E字串为:789。合并后的文件内容就是:“abc变咸蛋789abc2012789” 2、普通方式合并:简单将文件追加到尾部。。。。 除了切割合并功能外,还加多了一个字符串替换功能,就是将文本文件里指定的字符替换掉。 ASCII转换和大小写转换很简单,只要拖拽TXT文件到软件界面即可,或者直接输入字符也行。。。 商辕TXT切割合并器 v4.1 更新内容: 修正了切割字符会出现的乱码情况。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧