| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2431 人关注过本帖
标题:[求助]写一个函数连接2个字符串(这个也有问题了)
只看楼主 加入收藏
baby69yy2000
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2007-4-5
收藏
得分:0 
回复:(boot2046)呵呵,括号在这没什么影响的我是在...

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void StrCatenate(char *s1,char *s2);

int main()
{
char *str1,*str2;
str1=(char*)malloc(sizeof(char)); //就分配了一个字节,这段程序也实现了字符串的连接
str2=(char*)malloc(sizeof(char));
printf("Please input str1:\n");
scanf("%s",str1);
printf("Please input str2:\n");
scanf("%s",str2);
StrCatenate(str1,str2);
printf("result=%s\n",str1);
return 0;
}
void StrCatenate(char *s1,char *s2)
{
s1+=strlen(s1);
while((*s1=*s2)!='\0')
{
s1++;
s2++;
}
}
str1=(char*)malloc(sizeof(char));
str2=(char*)malloc(sizeof(char));
就分配了一个字节,程序怎么会通过呢?运行结果正确!!


2007-08-07 15:13
boot2046
Rank: 2
等 级:新手上路
威 望:3
帖 子:168
专家分:0
注 册:2007-7-23
收藏
得分:0 
在这样的小程序里,对内存操作比较少可能暂时还看不出来有什么问题,实际上你的str1已经越界了,也就是说超过了合法存取内存的范围,这样是很危险的



Linux是简单的,你不需要成为天才也能理解这种简单,Windows是复杂的,就算你是天才也不能理解这种复杂
2007-08-07 15:19
anelwl
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-7-26
收藏
得分:0 
回复:(baby69yy2000)回复:(boot2046)呵呵,括号...
str1和str2只是一个指针,表示指向一个char型的地址,用malloc(sizeof(char))有错吗?实际上防止越界应该这样分配malloc(sizeof(char)+1)

2007-08-07 15:35
boot2046
Rank: 2
等 级:新手上路
威 望:3
帖 子:168
专家分:0
注 册:2007-7-23
收藏
得分:0 
那请问ls的,你输入的字符串是存在什么地方的?

Linux是简单的,你不需要成为天才也能理解这种简单,Windows是复杂的,就算你是天才也不能理解这种复杂
2007-08-07 15:39
anelwl
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-7-26
收藏
得分:0 
指针只是指向字符串首地址,这样分配内存地址应该不会存在问题

2007-08-07 15:41
baby69yy2000
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2007-4-5
收藏
得分:0 
谢谢各位前辈
我把这段小程序重新整理了一下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *StrCatenate(char *s1,char *s2);
int main()
{
char *str1,*str2;
str1=(char*)malloc(100*sizeof(char));
str2=(char*)malloc(100*sizeof(char));
printf("Please input str1:\n");
scanf("%15s",str1);
printf("Please input str2:\n");
scanf("%15s",str2);
printf("result=%s\n",StrCatenate(str1,str2));
return 0;
}
char *StrCatenate(char *s1,char *s2)//函数必须返回操作数,即必须有输出接口
{ char *ps;//这里定义一个char 指针,使得其指想s1的初始地址
ps=s1;
s1+=strlen(s1);
while((*s1=*s2)!='\0')
{
s1++;
s2++;
}
return ps; //返回s1的初始地址
}

2007-08-07 15:43
boot2046
Rank: 2
等 级:新手上路
威 望:3
帖 子:168
专家分:0
注 册:2007-7-23
收藏
得分:0 


你都说了指针只是指向字符串首地址,那么你的字符串 的首地址是哪个?




Linux是简单的,你不需要成为天才也能理解这种简单,Windows是复杂的,就算你是天才也不能理解这种复杂
2007-08-07 15:45
kucap1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-8-7
收藏
得分:0 
顶了!不错的代码啊!顶了!支持啊!
2007-08-07 15:47
anelwl
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-7-26
收藏
得分:0 
回复:(boot2046)那请问ls的,你输入的字符串是存在...
字符串存在str1,str2分配的地址后面的缓冲区里

2007-08-07 15:47
boot2046
Rank: 2
等 级:新手上路
威 望:3
帖 子:168
专家分:0
注 册:2007-7-23
收藏
得分:0 
后面的缓冲区?

后面的缓冲区有多大??


Linux是简单的,你不需要成为天才也能理解这种简单,Windows是复杂的,就算你是天才也不能理解这种复杂
2007-08-07 15:49
快速回复:[求助]写一个函数连接2个字符串(这个也有问题了)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016503 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved