查看: 6834|回复: 3

[提问] 关于字符串输出问题请教

[复制链接]
发表于 2009-6-9 16:31:51 | 显示全部楼层 |阅读模式
关键词: 请教 , 输出 , 字符
看《感悟设计》 第17、“由数组非法操作想到的” 其中一段程序:
void print_string(int str_ID)
{
char string[10];  //修正后 char  string[50];
switch(str_ID)
{
case 0:  strcpy(string,“高压危险”);
       break;
case 1:  strcpy(string,“安全电压”);
       break;
case 2: strcpy(string,“请切换到备用电池,然后给主电池充电”);  //这里在原本定义 char string[10]; 时越界,修改为  char string[50];  后问题解决。
       break;
}
printf(string);
}

作者想要说明的是语句 case 2: strcpy(string,“请切换到备用电池,然后给主电池充电”);  由于string[ ]只定义了10个字节,因此造成数组越界,引起程序死机。好不容易查到问题所在,修正char  string[50]; 后,问题解决。(可以算出,该字符串大概需要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[100]; 或者更长?
发表于 2009-6-10 00:45:22 | 显示全部楼层
char str[sizeof("请切换到备用电池,然后给主电池充电") + 1];  

不要养成string做变量名(字符串名)的坏习惯~~~
 楼主| 发表于 2009-6-10 09:00:27 | 显示全部楼层
换一种写法:

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内存!
 楼主| 发表于 2009-6-10 09:11:11 | 显示全部楼层
再换一种写法:
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内存!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表