- 论坛徽章:
- 0
|
原帖由 yangsf5 于 2009-3-12 11:30 发表 ![]()
scanf("%s",&b);应该是把单个字符当成字符串了,
例如,输入'c',却变成"c" -> 'c' 和 '\0';
char a[10];
char b;
这个顺序时,b的'c',并把a[0]弄成'\0',a成空串了。
p=index(a,b);
index返回null。 ...
分析得很清晰,我写段输出地址的代码查看了变量的地址,的确是这样a的首位的确是被b的结束符\0覆盖了。更改了定义的顺序b的结束符号接不会把a的首位字符覆盖了。
代码如下:
#include <string.h>
#include <stdio.h>
main()
{
char *p;
int i=0;
char a[10];
char b;
printf("point p address:%x//%d\n",&p,&p);
printf("string a address:%x//%d\n",&a,&a);
printf("char b address:%x//%d\n",&b,&b);
printf("Enter a string:\n" ;
scanf("%s",a);
printf("Enter a char for search:\n" ;
scanf("%s",&b);
while(i<10)
{
printf("a[%d]:%c\n",i,a);
printf("a[%d] address is:%x//%d\n",i,&a,&a);
i++;
}
p=index(a,b);
printf("The search char is:%c\n",*p);
}
运行:
point p address:bfbffbdc//-1077937188
string a address:bfbffbcc//-1077937204
char b address:bfbffbcb//-1077937205
Enter a string:
qwertasdf
Enter a char for search:
f
a[0]:
a[0] address is:bfbffbcc//-1077937204
a[1]:w
a[1] address is:bfbffbcd//-1077937203
a[2]:e
a[2] address is:bfbffbce//-1077937202
a[3]:r
a[3] address is:bfbffbcf//-1077937201
a[4]:t
a[4] address is:bfbffbd0//-1077937200
a[5]:a
a[5] address is:bfbffbd1//-1077937199
a[6]:s
a[6] address is:bfbffbd2//-1077937198
a[7]:d
a[7] address is:bfbffbd3//-1077937197
a[8]:f
a[8] address is:bfbffbd4//-1077937196
a[9]:
a[9] address is:bfbffbd5//-1077937195
Segmentation fault (core dumped)
的确是a的首位被覆盖了。
但修改了scanf("%c",&b);之后还是不能正常运行:
代码如下:
#include <string.h>
#include <stdio.h>
main()
{
char *p;
char a[10];
char b;
printf("Enter a string:\n" ;
scanf("%s",a);
printf("Enter a char for search:\n" ;
scanf("%c",&b);
p=index(a,b);
printf("The search char is:%c\n",*p);
}
运行的情况:
Enter a string:
ppppp
Enter a char for search:
Segmentation fault (core dumped)
程序执行到输入完字符串a之后就出错了.... 请指点指点。
[ 本帖最后由 BSDUP 于 2009-3-12 18:08 编辑 ] |
|