c++學習筆記=>萬丈高樓平地起=>ex2:參數輸入、printf() 、 scanf()

c++學習筆記=>萬丈高樓平地起=>ex2:參數輸入、printf() 、 scanf()

一個程式基本的兩個部分就是輸入與輸入;以下我們討論參數傳遞問題;寫一個傳入參數字串的程式進行說明

我們按照ex1重新建立一個新的主控台專案存為ex2,打開ex2.cpp這個檔案

image

一樣我們在程式進入點int _tmain(int argc, _TCHAR* argv[])這個函式輸入以下程式碼,儲存檔案。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%s 向大家問好!\n",argv[1]);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])這一行告訴我們:_tmain這個函式的參數列有兩個參數;一個是int(整數型態)argc,_TCHAR*(自動切換unicode與非unicode字元指標)型態的  argv[] ,其中argv後面加入一個[]表示為陣列,這個陣列的大小未定,主要是傳入執行檔的參數個數決定,argc是參數的個數。通常argv[0]代表執行程式本身,argv[1]代表的是第1個以null結束的字串參數,所以我們要輸出傳入ex2.exe的字串參數可以寫成 printf("%s 向大家問好!\n",argv[1]);。

printf是一個可以格式化輸出資料的函數,在vsc++2005可以按F1功能鍵查詢他的相關說明,在說明檔寫所printf的函式如下:

int printf( const char *format [, argument]... );

它的參數列第一個參數資料型態為字元指標,在c++基本的資料型態有char(字元)這種資料型態,並沒有string(字串)這種資料型態,如果要使用string必須引用string.h這個標頭檔,但是如果不使用這個標頭檔,是不是就不能表示字串呢?。

按住Ctrl+F7進行編譯,將ex1範例中所建立的批次檔do.bat複製1份至ex2專案目錄中debug這個目錄,將do.bat這個檔案用筆記本程式打開編輯改成

ECHO OFF

::代表在目錄中找到.exe類型的檔案然後傳入字串參數"楊煥謀"
for %%t in (*.exe) do %%t "楊煥謀"
pause

執行do.bat看執行結果。

image

結果我們傳入的參數字串變成亂碼,為何會如此?原因是因為vs2005c++專案屬性字元集預設為使用unicode字元集。image

而我們在『命令提示字元』視窗中輸入的並非unicode字元集而是多位元組字集(中文系統的關係),所以ex2.exe所接受的字串參數無法正確顯示,我們只要將專案的一般屬性中字元集屬性改成未設定或使用多位元組字集,重新編譯專案,即可解決此問題。

 image

再次執行do.bat,即可得到正確的結果:

image

我們再將ex2改版成可以提示使用者輸入自己姓名,然後輸出一句某某向大家問好的句子。

// ex2.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    char s[80];
    printf("請輸入姓名:\n");
    scanf("%s",s);
    printf("%s 向大家問好!\n",s);
    return 0;
}

 

image

cool      歡迎引用,請注明來源出處!

作者:楊煥謀