【例2.17】分析下面程序的运行结果。
#include <stdio.h>
void main
(
)
{
int a=2
,b
,c
;
int x=25
,*p
;
p=&x
;
b=a**p
;
c=b*x/*p
;
//***********
//*
输出 *
//**********/
;
printf
("%d
,%d\n"
,b
,c
);
}
这个程序运行后给出一个奇怪的输出“50,1250”。“a**p”的表达式是对的,即“2*25=50”。但“b*x/*p”应是“50*25/25=50”,为何变成1250了呢?原来程序多了一个“;”号,使计算c的表达式变为
c=b*x ;
也就是原来“/*”被作为注释语句的开始,一直遇到“*/”才结束注释。如果没有多出的符号“;”,编译系统会给出如下错误信息。
error C2146 : syntax error : missing ' ;' before identifier 'printf'
这个信息也够人琢磨的,其实是“/”遇到“*”,有理说不清。
在碰到含有指针的表达式时,在前后留一个空格就可以有效地避免这类问题。例如,把这两条语句改为
b=a * *p ; c=b*x / *p ;
或者用括号明确表达式的含义,即
b=a* (*p ); c=b*x/ (*p );
这样既容易理解,又能正确编译。
【例2.18】下面的程序实现将输入字符串给t的内容复制到s中,这个程序能正确实现将输入“You and we”复制到s中吗?
#include <stdio.h>
#include <malloc.h>
void strcpy1
( char *
, char *
);
void main
(
)
{
char *s
, *t
;
s=
(char*
)malloc
(100
);
t=
(char*
)malloc
(100
);
scanf
( "%s"
, t
);
strcpy1
( s
, t
);
printf
( "%s\n"
, s
);
}
void strcpy1
( char *s
, char *t
)
{ while
( *s++ = *t++
); }
【解答】不能。理由如2.7节所述。解决的办法之一是使用gets函数。如果需要保留t,可以像下面这样实现。
#include <stdio.h>
#include <malloc.h>
void strcpy1
( char *
, char *
);
void main
(
)
{
char a[100]
, *t
,*s
;
s=
(char*
)malloc
(100
);
t=
(char*
)malloc
(100
);
gets
(a
);
t=a
;
strcpy1
( s
, t
);
printf
( "%s\n"
, s
);
}
void strcpy1
( char *s
, char *t
)
{ while
( *s++ = *t++
); }
如果不需要保留t,可以直接实现复制操作,实现的程序如下。
#include <stdio.h>
#include <malloc.h>
void strcpy1
( char *
, char *
);
void main
(
)
{
char a[100]
, *s
;
s=
(char*
)malloc
(100
);
gets
(a
);
strcpy1
( s
, a
);
printf
( "%s\n"
, s
);
}
void strcpy1
( char *s
, char *t
)
{ while
( *s++ = *t++
); }
记住:字符数组的指针也不能接受带空格的输入。
顺便提醒一下:指针比较复杂,本节只是从输入输出数据的角度讨论,以后将把它分到不同应用场合,结合实例说明。
