線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1778
推到 Plurk!
推到 Facebook!

請問一個不定參數函式問題

答題得分者是:Stallion
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-13 16:47:46 IP:211.78.xxx.xxx 未訂閱
#include  #include #include #include void MultiPrint(char *,...); void main(void){ MultiPrint("good","You","Are","Successful"); } void MultiPrint(char *value,...) { char *p; va_list ap; //memset(&ap,0x00,sizeof(va_list)); va_start(ap,value); p=value; do{ printf("%s",p); p=va_arg(ap,char *); }while(*p); va_end(ap); } 以上是我寫的程式,但我測試後都會發生印出來後面有一堆亂碼出現 請問各位高手要怎麼把它改進? 謝謝指教
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-13 16:57:58 IP:210.68.xxx.xxx 未訂閱
您好:    PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合 >
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-13 17:59:12 IP:211.78.xxx.xxx 未訂閱
#include 
#include 
#include 
#include     void MultiPrint(char *,...);    void main(void){
        MultiPrint("good","You","Are","Successful");
}    void MultiPrint(char *value,...)
{
        char *p;
        va_list ap;
        //memset(&ap,0x00,sizeof(va_list));            va_start(ap,value);
        
        //p=value;
        
        do{
                printf("%s",p);
                p=va_arg(ap,char *);
        }while(*p);        
        va_end(ap);
        
}
報歉,重貼一次,增加板主困擾請見諒
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-13 20:11:41 IP:203.204.xxx.xxx 未訂閱
您好: 我幫您改了一下:
#include 
#include 
#include 
#include 
#include     void MultiPrint(char *value,...)
{
va_list ap;
char *arg;
va_start(ap,value);
while (arg=va_arg(ap, char *))
 {
  printf(arg);
  getch();
 }
va_end(ap);
}    int main(int argc, char* argv[])
{
MultiPrint("good","You","Are","Successful",NULL);
}
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-13 20:49:07 IP:211.22.xxx.xxx 未訂閱
插個花! 這個問題本來解出來的作法跟 > -----------------------------------------------
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-13 22:18:44 IP:203.204.xxx.xxx 未訂閱
第一各參數並沒有不見,第一各參數是存在value中,可能是產生錯覺(會以為good是第一各不定參數,仔細看,第一各參數,跟第一各不定參數是不一樣的). 發表人 - supman 於 2005/06/13 22:21:23
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-13 22:22:58 IP:219.137.xxx.xxx 未訂閱
willchen 您好:    您所說的 "亂碼" 應該是沒有設定參數結尾的檢查字元,因此迴圈未能適時結束掉所致。 以下是參照 BCB Help 的範例來修改您的程式敘述,因為您以字串為參數,因此我在程式中以 NULL 字元為結尾的檢查參數 (當然您也可以以其它的字元來當作結尾的檢查參數),執行結果是 OK 的,另外您的寫法會像 Stallion 所說的一樣,會無法顯示出第一組參數字串,這是因為您僅有處理 "不定參數" 的部份,而忽略掉了第一組的 "固定參數",所以才無法印出第一個參數字串,我將它補進去並加註了說明,您參考一下:
#include 
#include     void MultiPrint(char *, ...);    int main(void)
{
    MultiPrint("good", "You", "Are", "Successful", NULL);  // 加上一組結束的識別參數        return 0;
}    void MultiPrint(char *value, ...)
{
    char *p;
    va_list ap;
    va_start(ap, value);        printf("%s ", value);    // 印出第一個參數字串 (固定參數)
    while ((p = va_arg(ap, char *)) != NULL) {    // 依序取出不定參數設給 p,直到取得 NULL 為止
        printf("%s ", p);
    }
    va_end(ap);
}
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-13 22:53:46 IP:211.22.xxx.xxx 未訂閱
引言: 第一各參數並沒有不見,第一各參數是存在value中,可能是產生錯覺(會以為good是第一各不定參數,仔細看,第一各參數,跟第一各不定參數是不一樣的). 發表人 - supman 於 2005/06/13 22:21:23
受教了!仔細看了supman兄的解說,再查看C函數說明,的確沒錯! ----------------------------------------------- Creation is the fundation of promotion.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-13 22:59:42 IP:200.226.xxx.xxx 未訂閱
supman 您好: 只顧矇著頭敲鍵盤,沒想到您已經作了補充說明,這變得有點重覆了,真是不好意思,請多包涵。
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-13 23:18:21 IP:211.74.xxx.xxx 未訂閱
請問一下,一定得在函數後面加個NULL才可以印多個字串嗎?? 這個想法我也有想過,但覺得這樣的函式使用起來不方便 有比較好的寫法可以省掉NULL嗎??
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-13 23:34:37 IP:211.22.xxx.xxx 未訂閱
引言: 請問一下,一定得在函數後面加個NULL才可以印多個字串嗎?? 這個想法我也有想過,但覺得這樣的函式使用起來不方便 有比較好的寫法可以省掉NULL嗎??
willchen兄,以下摘錄一段va...系列的函數說明: Return Value va_start and va_end return no values; va_arg returns the current argument in the list (the one that ap is pointing to). 所以引用這個函數解析不定參數,一定要傳一給值作為爾後var_arg解出來的值作為比對,以利爾後程設者可以知道已經到了參數尾,這個函數無法一開始就可提供到底呼叫者傳了多少個參數過來。 -----------------------------------------------
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-13 23:44:15 IP:203.204.xxx.xxx 未訂閱
再補充,最後為何會放個NULL的原理跟底下這篇一下,參考看看,C語言的特性這應該是唯一解. http://delphi.ktop.com.tw/topic.php?topic_id=70340
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-13 23:46:41 IP:211.74.xxx.xxx 未訂閱
謝啦,看來還是得加上NULL才能夠達成,不然就得設定幾個參數個數在第一個定參數內才能達成 因為最近剛好看到公司有範例實作這個不定參數函式,好奇所以自己來試看看,發現這個問題, 只是最後一點我比較好奇的是,那C內建的printf是怎麼實作出來讓使用者可以不用告訴程式他最後依個參數是不是NULL,有點神奇,還望高手指點
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-13 23:56:56 IP:211.74.xxx.xxx 未訂閱
再補充一下,由於我本身是在VMS下做HP C的程式設計,所以BCB的這些內建函式我都沒辦法用,所以只能用土法煉鋼來作Orz
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-14 00:04:55 IP:219.137.xxx.xxx 未訂閱
willchen 您好:
引言:請問一下,一定得在函數後面加個NULL才可以印多個字串嗎?? 這個想法我也有想過,但覺得這樣的函式使用起來不方便 有比較好的寫法可以省掉NULL嗎??
不是非要在函式後方加上個 NULL 不可,只不過以您宣告的方式來處理時,這是最簡單與最直覺的作法,給您一個不同方式的範例參考一下:
#include 
#include     void MultiPrint(int, ...);    int main(void)
{
    MultiPrint(4, "good", "You", "Are", "Successful");        return 0;
}    void MultiPrint(int count, ...)
{
    char *p;
    va_list ap;
    int i;
    int cnt;        va_start(ap, count);
    for(i=0; i
上述範例是將第一組參數 (固定參數) 改為 int,並以不定參數的數量為值傳給 MultiPrint() 來處理。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-06-14 00:11:39 IP:219.137.xxx.xxx 未訂閱
引言:謝啦,看來還是得加上NULL才能夠達成,不然就得設定幾個參數個數在第一個定參數內才能達成....
怎麼搞的,我在這一篇的回覆總是慢半拍呢?willchen 已經知道了嘛~
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-06-14 01:14:22 IP:203.204.xxx.xxx 未訂閱
再再補充一點,RedSnow大人寫的其實也是換湯不換藥的作法。 printf為何不需要最後面放一個NULL,不是他很神奇,而是printf("%s %s",s,s1)仔細看,前面的"%s %s"已經告訴printf有兩個參數了。 再說一下,咳....感覺這一題好像應該是小弟得分才對,不曉得willchen大人覺得小弟那邊答的不好@@"
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-06-14 09:09:04 IP:211.78.xxx.xxx 未訂閱
其實各位大師都答得很好,但分數只能給一個人,害小弟我一時無法分出誰好誰壞>_<" 如果有給錯分,還望各位大師見諒,突然覺得不定參數寫起來還不錯玩 所以寫來玩看看,剛好有問題,想問問看有什麼不錯的想法 純粹討論,還望各位大師見諒
系統時間:2024-06-02 2:32:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!