不用strcat函数连接两个字符串

qq_18876709 2014-08-07 05:00:09
程序如下:
#include "stdio.h"
#include "conio.h"
#include "math.h"
main()
{char c,str1[100],str2[100],str3[300];
int i,j;
printf("Please input the first string\nConfirm by Enter\n");
gets(str1);
printf("Please input the second string\nConfirm by Enter\n");
gets(str2);
for(i=0;(c=str1[i])!='\0';i++)
{str3[i]=str1[i];
};
j=i;
for(i=0;(c=str2[i])!='\0';i++,j++)
{str3[j]=str2[i];
};
printf("The string which has been connected is:\n%s",str3);
getch();
}

问题:
有时候能正常连接 而有的时候会出现一个小小的表情
...全文
7949 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
justin_duan 2014-08-08
  • 打赏
  • 举报
回复
可以用strlen函数检查一下,你目标的str3,是不是你预期的str1+str2的长度,输出有乱码的情况str3肯定比你str1+str2长。 建议单步调试一下,在有乱码的情况下结尾必然不是'\0'
modyaj 2014-08-08
  • 打赏
  • 举报
回复
凡是遇到 过长 过短字符串问题 优先考虑‘\0’结束符的问题!
Mr丶Lennie 2014-08-08
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
	char c,str1[100],str2[100],str3[300];
	int i,j;
	printf("Please input the first string\nConfirm by Enter\n");
	gets(str1);
	printf("Please input the second string\nConfirm by Enter\n");
	gets(str2);
	for(i=0;(c=str1[i])!='\0';i++)
	{
		str3[i]=str1[i];
	};
	j=i;
	for(i=0;(c=str2[i])!='\0';i++,j++)
	{
		str3[j]=str2[i];
	};

	str3[j] = '\0';	//添加'\0'

	printf("The string which has been connected is:\n%s",str3);

	getch();
}
因为你代码能将两个字符串拼接起来,但是输出时却输出了其他的字符,所以就可以知道输出时并没有正常结束,输出字符串一般都是遇到‘\0’字符才会结束输出。而且你两个for循环判断都是以'\0'作为结束标识,所以数组最后一个'\0'字符并不会存入数组中,只需要在数组最后添加'\0'字符就能正常输出了。
707wk 2014-08-07
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
第二个字节的结束符要放进去才对,改了一下。增加了一句。

#include "stdio.h"
#include "conio.h"
#include "math.h"
int main()
{
	char c,str1[100],str2[100],str3[300];
	int i,j;
	printf("Please input the first string\nConfirm by Enter\n");
	gets(str1);
	printf("Please input the second string\nConfirm by Enter\n");
	gets(str2);
	for(i=0;(c=str1[i])!='\0';i++)
	{
		str3[i]=str1[i];
	}
	j=i;
	for(i=0;(c=str2[i])!='\0';i++,j++)
	{
		str3[j]=str2[i];
	}
	str3[j]=str2[i];//'\0'要放进去才行。
	printf("The string which has been connected is:\n%s",str3);
	getch();
	return 0;
}
+1
守山大神 2014-08-07
  • 打赏
  • 举报
回复
过来围观一下 顺便说一句,我处理字符串要是忘了加结尾,一般都是出一堆“烫”
代码誊写工 2014-08-07
  • 打赏
  • 举报
回复
先用bzero或memset初始化一下str3。
  • 打赏
  • 举报
回复
引用 3 楼 qq_18876709 的回复:
嗯 确实是 加一个'\0'可以解决问题 但不知原因是什么
原因就是,没有'\0'结束符,会把后面的内存的东西也显示出来,直到遇到‘\0’为止,所以你那里出现了那个当年叫做“实人头”的字符。
qq_18876709 2014-08-07
  • 打赏
  • 举报
回复
嗯 确实是 加一个'\0'可以解决问题 但不知原因是什么
赵4老师 2014-08-07
  • 打赏
  • 举报
回复
memmove
  • 打赏
  • 举报
回复
第二个字节的结束符要放进去才对,改了一下。增加了一句。

#include "stdio.h"
#include "conio.h"
#include "math.h"
int main()
{
	char c,str1[100],str2[100],str3[300];
	int i,j;
	printf("Please input the first string\nConfirm by Enter\n");
	gets(str1);
	printf("Please input the second string\nConfirm by Enter\n");
	gets(str2);
	for(i=0;(c=str1[i])!='\0';i++)
	{
		str3[i]=str1[i];
	}
	j=i;
	for(i=0;(c=str2[i])!='\0';i++,j++)
	{
		str3[j]=str2[i];
	}
	str3[j]=str2[i];//'\0'要放进去才行。
	printf("The string which has been connected is:\n%s",str3);
	getch();
	return 0;
}

69,369

社区成员

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

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