为什么这道C语言的关于字符数组的题我做错了?高手帮忙看下~~

题目是这样的:从键盘上输入两个字符串(长度不大于20)和整数n(0<n<=20),要求将第二个字符串插在第一个字符串的n位置开始处并输出。
示例如第一个字符串为"you are ok."
第二个字符串为"fine and "
输入的整数为8,则表示将fine插在ok前面(y前面为位置0,o前面的位置为8),输出为you are fine and ok.

然后我的程序是:#include <stdio.h>
int main()
{
char str1[20],str2[20];
int n,n1,n2,i=0,j=0,k;
printf("请输入第一个字符串:\n");
gets(str1);
printf("请输入第二个字符串:\n");
gets(str2);
printf("请输入一整数:\n");
scanf("%d",&n);
if(n<=0||n>20)
{
do
{printf("输入错误,请重新输入!\n");
scanf("%d",&n);
}while(n<=0||n>20);
}
while(str1[i]!=str1[k])
i++;
while(str1[i++]=str2[j++]!='\0')
printf("链接后的字符串:\n");
puts(str1);
return 0;
}但结果不能运行呀~~~~!请大家看看我哪里错了

//第一,“n位置的开始处”这个说法很不准确,我的理解是:如果n位置是字符'X',那么插入字符后为:Xbbbb(设"bbbb"为插入的字符)
//按照你介绍,加上空格这个字符,'o'前面的位置应该是9
//第二,你的字符串太小了,如果str1里的字符为12个,str2里的字符10个,这样插入的话很容易就溢出
//第三,插入的方法不对
#include <stdio.h>
int main()
{
char str1[100],str2[100];//我改为100,使它们足够用
int n,n1,n2,i=0,j=0,k;
int size1=0;//用来记录str1里的字符数
int size2=0;//用来记录str2里的字符数
printf("请输入第一个字符串:\n");
gets(str1);
printf("请输入第二个字符串:\n");
gets(str2);
printf("请输入一整数:\n");
scanf("%d",&n);

for(i=0;i<100;i++)//计算str1里的字符数
{ if(str1[i]!='\0') size1++; if(str1[i]=='\0') break; }
for(i=0;i<100;i++)//计算str2里的字符数
{ if(str2[i]!='\0') size2++; if(str2[i]=='\0') break; }
//还有其他的情况例如字符数过多(str1用了80个,str2有30个)等待情况都可以通过这两个记录来进行判断,就不赘述了

if(n<=0||n>size1)//判断条件"n<=0||n>20"也不对,在n=18处插入一个大小为4的字符串是不行的
//我用这个判断插入点是否在str1的那些字符内,自己定的,好像你没这个要求
{
do
{printf("输入错误,请重新输入!\n");
scanf("%d",&n);
}while(n<=0||n>size1);
}

/* while(str1[i]!=str1[k])
i++;
while(str1[i++]=str2[j++]!='\0')
printf("链接后的字符串:\n");
puts(str1);

你的这个实现插入的语句有问题,在插入的时候,
要先找到插入点,将str1的插入点之后的字符往后挪,
以空处size2个长度来存放str2的字符
*/

for(i=size1+size2-1;i>n;i--)//后挪
str1[i]=str1[i-size2];//OK

for(i=n;i<n+size2;i++)//插入
{str1[i]=str2[j],j++;}//OK

puts(str1);

return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-13
错误在倒数第五行:
while(str1[i++]=str2[j++]!='\0')
应该为
while((str1[i++]=str2[j++])!='\0')
请原谅我为了明显使用了全角括号
不等号(!=)的优先级大于赋值号(=),所以你那一句实际上是while(str1[i++]=(str2[j++]!='\0'))
str1里不是1就是0,怎么可能对。。。
尽量不要再逻辑表达式中使用赋值号(=),很容易出错,要格外小心追问

修改后,情况好转很多,但结果还是不对呀。结果输不出N后的字符串了~~我想应该是方法出问题了

追答

可能吧,不过我没有仔细阅读你的代码,我只是发现了最明显的错误
又发现了个新问题,你的str1,起码得是20+20+1吧
还有就是你的str1和str2的Buffer实在太小,如果输入者不守规矩输入了大于20的字符串,你的程序就溢出了

追问

帮看下吧。。这是我的作业,写到这里卡住了,急死了~

追答

flag = 1;
for (i = 0; i = n) {
flag = 0;
puts(str2);
}
putc(str1[i]);
}

追问

还是不对。。

第2个回答  2011-04-13
k没赋值,输入的n没用到
第3个回答  2011-04-13
while(str1[i]!=str1[k]),k就没赋值就用了追问

我开始也怀疑这一步,我这一步的目的是将前字符串的下标定位在K的位置然后插入第二个字符串,这样做对么?如果不对该怎么做?

追答

不是已经定位到n了吗?你先输出str1的前n位,然后输出str2,再输出str1剩余的部分不就行了

追问

汗。。还是不行,我把while(str1[i]!=str1[k])里面的K改成N了,也没成功。。

追答

不要这么做,照我说的做

追问

想不出那要怎么编写啊?能写下这步的程序么?谢谢了

追答

for(i=0;i<n;i++){
putc(str1[i]);
}
puts(str2);
for(i=n;str[i]!='\n';i++){
putc(str1[i]);
}
//试试,我也不知道对不对

第4个回答  2011-04-13
有问题先检查一下,你能告诉我你那个k是什么么?没有赋值过
相似回答