查看: 2158|回复: 3

[提问] 关于字符串输出问题请教 [复制链接]

ydz0515 (离线)
积分
2692
帖子
27
发表于 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]; 或者更长?
hotpower (离线)
积分
82853
帖子
313
发表于 2009-6-10 00:45:22 |显示全部楼层
char str[sizeof("请切换到备用电池,然后给主电池充电") + 1];  

不要养成string做变量名(字符串名)的坏习惯~~~
●█〓██▄▄▄▄▄▄ ●●●●●●→ ''''╭WWWW╮
▄▅██████▅▄▃▂ 传播非典灌水四方 ( ●_●)
███天█马█行█空████ '''',,,;,;,;'''/▇\''
◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ 群魔乱舞见阳光/MMMM\
ydz0515 (离线)
积分
2692
帖子
27
发表于 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内存!
ydz0515 (离线)
积分
2692
帖子
27
发表于 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备11013910号 | 京公网安备11010502021702
回顶部