<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 7658|回復: 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
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷