字符串拼接问题

complety 2012-01-09 11:44:53
今天无聊的时候写个字符串拼接的程序。
结果发现了点问题。
#include<stdio.h>
int main()
{
int i=0;
char a[5],b[5],d[5],c[10],*p;
printf("please input a:");
scanf("%s",a);
strcpy(d,a);
setbuf(stdin,NULL);
printf("please input b:");
scanf("%s",b);
//a[0]=a[-10];这2个注释都可以解决问题,可我不晓得为什么a[0]会被改变了
//p=d;
p=a;
while(i!=5){
c[i]=*(p+i);
i++;
}
p=b;
i=0;
while(i!=5){
c[5+i]=*(p+i);
i++;
}
i=0;
while(i!=10){
printf("%c",c[i]);
i++;
}
return 0;
}
a和b分别输入hello和kitty
gdb的时候发现a[0]被改成\000了,
不解。
求解
...全文
158 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
黯然 2012-01-10
  • 打赏
  • 举报
回复
不明白怎么就这么爱纠结于这些未定义的行为...
complety 2012-01-10
  • 打赏
  • 举报
回复
我说的是//里面是解决问题的法子。提供了2种。
那不是个巧合,
5改成6,10改成12,然后a[0]=a[-12]。结果符合。
赵4老师 2012-01-10
  • 打赏
  • 举报
回复
Q:为什么a[0]会被改变了
A:
To set a breakpoint when a variable “a[0]” changes value
From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable “a[0]”.
Click OK to set the breakpoint.
complety 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anyidan 的回复:]
引用 2 楼 complety 的回复:

我说的是//里面是解决问题的法子。提供了2种。
那不是个巧合,
5改成6,10改成12,然后a[0]=a[-12]。结果符合。


赋值后当然会变
[/Quote]
问题一:
比如说a输入hello,b输入kitty,应该输出hellokitty。实际上输出ellokitty。
问题二:
如果再定义一个char d[5]。
a接受输入后,然后把a复制给d。然后把d的地址给p。那么可以输出hellokitty。
问题三:
把所以的5换成6,把所有的10换成12,然后把a[0]=a[-12]。这一步可以把a[0]改成'h'。
单步的时候可以发现。从a[-10]一直到a[-1]是hellokitty。
我主要想问的问题是。
上面那个程序不能输出hellokitty,而是ellokitty。2个注释给的是可以输出hellokitty的法子。
complety 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gqjjqg 的回复:]
CSDN看的越多,越觉得我语文太差,理解能力不足.....

问题一:

"今天无聊的时候写个字符串拼接的程序。
结果发现了点问题。"

这里的问题是什么问题?

问题二:

“这2个注释都可以解决问题,可我不晓得为什么a[0]会被改变了”

为什么a[0]会被改变了,这个不是1楼回答了吗?

问题三:

5改成6,10改成12,然后a[0]=a[-12]。……
[/Quote]
你把程序运行下就明白了,
问题一:
比如说a输入hello,b输入kitty,应该输出hellokitty。实际上输出ellokitty。
问题二:
如果再定义一个char d[5]。
a接受输入后,然后把a复制给d。然后把d的地址给p。那么可以输出hellokitty。
问题三:
把所以的5换成6,把所有的10换成12,然后把a[0]=a[-12]。这一步可以把a[0]改成'h'。
单步的时候可以发现。从a[-10]一直到a[-1]是hellokitty。
我主要想问的问题是。
上面那个程序不能输出hellokitty,而是ellokitty。2个注释给的是可以输出hellokitty的法子。
但我不晓得为什么会输出ellokitty。
jacknes009 2012-01-10
  • 打赏
  • 举报
回复
没有看明白。
gqjjqg 2012-01-10
  • 打赏
  • 举报
回复
CSDN看的越多,越觉得我语文太差,理解能力不足.....

问题一:

"今天无聊的时候写个字符串拼接的程序。
结果发现了点问题。"

这里的问题是什么问题?

问题二:

“这2个注释都可以解决问题,可我不晓得为什么a[0]会被改变了”

为什么a[0]会被改变了,这个不是1楼回答了吗?

问题三:

5改成6,10改成12,然后a[0]=a[-12]。结果符合。
到底是哪里的5,哪里的 10,哪个结果符合什么样的结果?
小班得瑞 2012-01-10
  • 打赏
  • 举报
回复
好纠结啊
AnYidan 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 complety 的回复:]

我说的是//里面是解决问题的法子。提供了2种。
那不是个巧合,
5改成6,10改成12,然后a[0]=a[-12]。结果符合。
[/Quote]

赋值后当然会变
黯然 2012-01-09
  • 打赏
  • 举报
回复
a[-10]是未定义行为,里面的值理论上是随机的..
你都执行了赋值语句a[0]=a[-10];a[0]肯定会改变啊

69,373

社区成员

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

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