为什么这道C语言的关于字符数组的题我做错了?高手帮忙看下~~
题目是这样的:从键盘上输入两个字符串(长度不大于20)和整数n(0<n<=20),要求将第二个字符串插在第一个字符串的n位置开始处并输出。示例如第一个字符串为"youar...
题目是这样的:从键盘上输入两个字符串(长度不大于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;
}但结果不能运行呀~~~~!请大家看看我哪里错了 展开
示例如第一个字符串为"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;
}但结果不能运行呀~~~~!请大家看看我哪里错了 展开
5个回答
展开全部
//第一,“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;
}
//按照你介绍,加上空格这个字符,'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;
}
展开全部
错误在倒数第五行:
while(str1[i++]=str2[j++]!='\0')
应该为
while((str1[i++]=str2[j++])!='\0')
请原谅我为了明显使用了全角括号
不等号(!=)的优先级大于赋值号(=),所以你那一句实际上是while(str1[i++]=(str2[j++]!='\0'))
str1里不是1就是0,怎么可能对。。。
尽量不要再逻辑表达式中使用赋值号(=),很容易出错,要格外小心
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的字符串,你的程序就溢出了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while(str1[i]!=str1[k]),k就没赋值就用了
更多追问追答
追问
我开始也怀疑这一步,我这一步的目的是将前字符串的下标定位在K的位置然后插入第二个字符串,这样做对么?如果不对该怎么做?
追答
不是已经定位到n了吗?你先输出str1的前n位,然后输出str2,再输出str1剩余的部分不就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有问题先检查一下,你能告诉我你那个k是什么么?没有赋值过
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询