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;
}