关于字符串输出问题请教
2009年06月09日 16:31 发布者:ydz0515
看《感悟设计》 第17、“由数组非法操作想到的” 其中一段程序:void print_string(int str_ID)
{
char string; //修正后 char string;
switch(str_ID)
{
case 0: strcpy(string,“高压危险”);
break;
case 1: strcpy(string,“安全电压”);
break;
case 2: strcpy(string,“请切换到备用电池,然后给主电池充电”); //这里在原本定义 char string; 时越界,修改为 char string; 后问题解决。
break;
}
printf(string);
}
作者想要说明的是语句 case 2: strcpy(string,“请切换到备用电池,然后给主电池充电”); 由于string[ ]只定义了10个字节,因此造成数组越界,引起程序死机。好不容易查到问题所在,修正char string; 后,问题解决。(可以算出,该字符串大概需要35字节。)
我的疑问,printf(*str)语句可以直接输出字符串,为何作者在这里却要经过一个中间步骤?例:
strcpy(string,“高压危险”);
printf(string);
先把code区的字符串常量"高压危险"拷贝到data区数组string[ ]内,然后printf(string);
多此一举呀?谁能帮俺解释这种高手写的程序,毕竟作者是研发主管,干了十多年开发工作,又是写在书上教导咱菜鸟的程序。实在一头雾水。
这段程序的编译结果大致为:
linking...
Program Size: data=80.1 xdata=0 code=1418
"test" - 0 Error(s), 0 Warning(s).
?STACK=68H(=104) 堆栈指针在程序初始就高到了104,还有多少字节好用?
那如果要求输出的字符串更长的话,按照作者程序概念,是不是我要定义char string; 或者更长?
网友评论
ydz0515 2009年06月10日
换一种写法:
void print_string(int str_ID)
{
switch(str_ID)
{
case 0: printf("高压危险");
break;
case 1: printf("安全电压");
break;
case 2: printf("请切换到备用电池,然后给主电池充电");
break;
}
}
编译结果:
linking...
Program Size: data=9.0 xdata=0 code=238
"test" - 0 Error(s), 0 Warning(s).
?STACK=08H 堆栈指针指向08, 没用到任何数组和RAM内存!
换一种写法:
void print_string(int str_ID)
{
switch(str_ID)
{
case 0: printf("高压危险");
break;
case 1: printf("安全电压");
break;
case 2: printf("请切换到备用电池,然后给主电池充电");
break;
}
}
编译结果:
linking...
Program Size: data=9.0 xdata=0 code=238
"test" - 0 Error(s), 0 Warning(s).
?STACK=08H 堆栈指针指向08, 没用到任何数组和RAM内存!
ydz0515 2009年06月10日
再换一种写法:
code char *a="高压危险";
code char *b="安全电压";
code char *c="请切换到备用电池,然后给主电池充电";
void print_string(int str_ID)
{
switch(str_ID)
{
case 0: printf(a);
break;
case 1: puts(b);
break;
case 2: puts(c);
break;
}
}
编译结果:
linking...
Program Size: data=9.0 xdata=0 code=234
"test" - 0 Error(s), 0 Warning(s).
?STACK=08H 堆栈指针指向08, 没用到任何数组和RAM内存!
再换一种写法:
code char *a="高压危险";
code char *b="安全电压";
code char *c="请切换到备用电池,然后给主电池充电";
void print_string(int str_ID)
{
switch(str_ID)
{
case 0: printf(a);
break;
case 1: puts(b);
break;
case 2: puts(c);
break;
}
}
编译结果:
linking...
Program Size: data=9.0 xdata=0 code=234
"test" - 0 Error(s), 0 Warning(s).
?STACK=08H 堆栈指针指向08, 没用到任何数组和RAM内存!
char str;
不要养成string做变量名(字符串名)的坏习惯~~~