8.8 输入一个4位数字,要求输出这4个数字字符,但每两个数字间插入一个输入的字符。如输入“1990”,插“W”,应输出“1W9W9W0"。”(改)

8.8 输入一个4位数字,要求输出这4个数字字符,但每两个数字间插入一个输入的字符。如输入“1990”,插“W”,应输出“1W9W9W0"。”(改)

纠结了将近一星期,其中还是用了“技术问答”,http://ask.csdn.net/questions/275108,感谢“StopZone”的热心回答。


StopZone
    StopZone   2016.08.10 23:08
    已采纳

puts(char *) 的输出格式是遇到'\0' 结束输出,s2所指向的字符串末尾没有'\0',所以就把非法内存的东西输出出来了。


我在纸上也推出了结果。这个程序比答案书上的好理解,没有按照原题的要求使用函数。但是想改为函数是分分钟的问题。我认为我写的比答案书上的更容易理解。

#include<stdio.h>//8.8 输入一个4位数字,要求输出这4个数字字符,但每两个数字间插入一个输入的字符。如输入“1990”,插“W”,应输出“1W9W9W0"。”(改)
int main()
{
	char s1[4],s2[7],c;
	int i,j;
	printf("请输入s1:");
	gets(s1);
	printf("*****s1输入成功*****\n");
	puts(s1);
	printf("\n");
	printf("请输入要插入的字符:");
	scanf("%c",&c);
	fflush(stdin);
	printf("*****要插入的字符c输入成功*****\n");
	printf("%c\n",c);
	printf("\n");	
	for(i=0,j=0;i<=4;i++,j++)
	{
		s2[j]=s1[i];
		s2[j+1]=c;
		j++;
	}
	printf("*****c字符插入s2字符串成功*****\n");
	for(i=0;i<7;i++)
	{
		printf("%c",s2[i]);
	}
	printf("\n");
	for(i=0;i<7;i++)
	{
		printf("s2[%d]=%c ",i,s2[i]);
	}
	printf("\nputs()输出:");
	puts(s2);
	return 0;
}
结果如下图:

结果还有问题,用puts()函数输出的多输出了个W。应输出“1W9W9W0"。

我想出答案了,当i=4时,j等于了8,s2[j+1]=c导致对s2[8]进行了赋值,系统又自动在s2[8]的后边加上了'\0'。所以导致输出“1W9W9W0W”。更改如下:

#include<stdio.h>//8.8 输入一个4位数字,要求输出这4个数字字符,但每两个数字间插入一个输入的字符。如输入“1990”,插“W”,应输出“1W9W9W0"。”(改)
int main()
{
	char s1[4],s2[7],c;
	int i,j;
	printf("请输入s1:");
	gets(s1);
	printf("*****s1输入成功*****\n");
	puts(s1);
	printf("\n");
	printf("请输入要插入的字符:");
	scanf("%c",&c);
	fflush(stdin);
	printf("*****要插入的字符c输入成功*****\n");
	printf("%c\n",c);
	printf("\n");	
	for(i=0,j=0;i<=4;i++,j++)
	{
		s2[j]=s1[i];	
		j=j+1;
		s2[j]=c;
		if(j>=7)//j的最大值为7 
		{
			j=7;
			s2[j]='\0';
		}				
	}
	printf("*****c字符插入s2字符串成功*****\n");
	for(i=0;i<7;i++)
	{
		printf("%c",s2[i]);
	}
	printf("\n");
	for(i=0;i<7;i++)
	{
		printf("s2[%d]=%c ",i,s2[i]);
	}
	printf("\nputs()输出:");
	puts(s2);
	return 0;
}

结果如下:

完美解决。主要是通过如下代码,控制“  s2[7]='\0'  ”。

for(i=0,j=0;i<=4;i++,j++)
	{
		s2[j]=s1[i];	
		j=j+1;
		s2[j]=c;
		if(j>=7)//j的最大值为7 
		{
			j=7;
			s2[j]='\0';
		}				
	}

以下是函数的方法:

#include<stdio.h>//8.8 输入一个4位数字,要求输出这4个数字字符,但每两个数字间插入一个输入的字符。如输入“1990”,插“W”,应输出“1W9W9W0"。”(函数的方法)
void ChaRuZiFu(char s1[],char s2[])//插入字符函数
{
	char c;
	int i,j;
	printf("请输入要插入的字符:");
	scanf("%c",&c);
	fflush(stdin);
	printf("*****要插入的字符c输入成功*****\n");
	printf("%c\n",c);
	printf("\n");
	for(i=0,j=0;i<=4;i++,j++)
	{
		s2[j]=s1[i];	
		j=j+1;
		s2[j]=c;
		if(j>=7)//j的最大值为7 
		{
			j=7;
			s2[j]='\0';
		}				
	}
	printf("*****c字符插入s2字符串成功*****\n");
	for(i=0;i<7;i++)
	{
		printf("%c",s2[i]);
	}
	printf("\n");
	for(i=0;i<7;i++)
	{
		printf("s2[%d]=%c ",i,s2[i]);
	}
	printf("\nputs()输出:");
	puts(s2);	
}
	
int main()
{
	char s1[4],s2[7];
	printf("请输入s1:");
	gets(s1);
	printf("*****s1输入成功*****\n");
	puts(s1);
	printf("\n");	
	ChaRuZiFu(s1,s2);
	return 0;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qslife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值