C/C++筆記之字串
gets() 函式
該函式的原型為:
# include <stdio.h>
char *gets(char *str);
這個函式很簡單,只有一個引數。引數型別為 char* 型,即 str 可以是一個字元指標變數名,也可以是一個字元陣列名。
gets() 函式的功能是從輸入緩衝區中讀取一個字串儲存到字元指標變數 str 所指向的記憶體空間。
下面將前面中使用 scanf 輸入字串的程式改一下:
- # include <stdio.h>
- int main(void)
- {
- char str[20] = "\0"; //字元陣列初始化\0
- printf("請輸入字串:");
- gets(str);
- printf("%s\n", str);
- return 0;
- }
輸出結果是:
請輸入字串:i love you
i love you
可見,gets() 函式不僅比 scanf 簡潔,而且,就算輸入的字串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個字元陣列。也就是說:
- gets(str);
完全可以取代:
- scanf("%s", string);
不僅程式碼更簡潔,而且可以直接輸入帶空格的字串。同樣,前面章節中,對字元指標變數所指向的記憶體單元進行初始化也可以用 gets(),下面將那個程式也改一下,將 scanf 換成 gets():
- # include <stdio.h>
- int main(void)
- {
- char str[30];
- char *string = str; //一定要先將指標變數初始化
- printf("請輸入字串:");
- gets(string); //也可以寫成gets(str);
- printf("%s\n", string); //輸出引數是已經定義好的“指標變數名”
- return 0;
10. }
輸出結果是:
請輸入字串:Hi i...like you
Hi i...like you
此外,關於使用 gets() 函式需要注意:使用 gets() 時,系統會將最後“敲”的換行符從緩衝區中取出來,然後丟棄,所以緩衝區中不會遺留換行符。這就意味著,如果前面使用過 gets(),而後面又要從鍵盤給字元變數賦值的話就不需要吸收回車清空緩衝區了,因為緩衝區的回車已經被 gets() 取出來扔掉了。下面寫一個程式驗證一下:
- # include <stdio.h>
- int main(void)
- {
- char str[30];
- char ch;
- printf("請輸入字串:");
- gets(str);
- printf("%s\n", str);
- scanf("%c", &ch);
- 10. printf("ch = %c\n", ch);
- 11. return 0;
12. }
輸出結果是:
請輸入字串:i love you
i love you
Y
ch = Y
我們看到,沒有清空緩衝區照樣可以輸入'Y',因為 gets() 已經將緩衝區中的回車取出來丟掉了。如果前面使用的不是 gets() 而是 scanf,那麼通過鍵盤給 ch 賦值前就必須先使用 getchar() 清空緩衝區。
puts() 函式
該函式的原型為:
# include <stdio.h>
int puts(const char *s);
這個函式也很簡單,只有一個引數。s可以是字元指標變數名、字元陣列名,或者直接是一個字串常量。功能是將字串輸出到螢幕。輸出時只有遇到 '\0' 也就是字串結束標誌符才會停止。
下面寫一個程式:
- # include <stdio.h>
- int main(void)
- {
- char name[] = "祖國!";
- printf("%s\n", name); //用printf輸出
- puts(name); //用puts()輸出
- puts("我愛你!"); //直接輸出字串
- return 0;
- }
輸出結果是:
祖國!祖國!我愛你!
可見使用 puts() 輸出更簡潔、更方便。而且使用 puts() 函式連換行符 '\n' 都省了,使用 puts() 顯示字串時,系統會自動在其後新增一個換行符,也就是說:
- printf("%s\n", name);
和:
- puts(name);
是等價的。所以前面字元指標變數中:
- printf("%s\n", string);
也可以直接寫成:
- puts(string);
我們寫一個程式來驗證一下:
- # include <stdio.h>
- int main(void)
- {
- char *string = "I Love You China!";
- puts(string);
- return 0;
- }
輸出結果是:
I Love You China!
但是 puts() 和 printf() 相比也有一個小小的缺陷,就是如果 puts() 後面的引數是字元指標變數或字元陣列,那麼括號中除了字元指標變數名或字元陣列名之外什麼都不能寫。比如 printf() 可以這樣寫:
- printf("輸出結果是:%s\n", str);
而 puts() 就不能使用如下寫法:
- puts(輸出結果是:str);
因此,puts() 雖然簡單、方便,但也僅限於輸出字串,功能還是沒有 printf() 強大。
getch():
所在標頭檔案:conio.h
函式用途:從控制檯讀取一個字元,但不顯示在螢幕上
函式原型:int getch(void)
返回值:讀取的字元
例如:
char ch;或int ch;
getch();或ch=getch();
用getch();會等待你按下任意鍵,再繼續執行下面的語句;
用ch=getch();會等待你按下任意鍵之後,把該鍵字元所對應的ASCII碼賦給ch,再執行下面的語句。
1.所在標頭檔案是conio.h。而不是stdio.h。
2.在使用之前要呼叫initscr(),結束時要呼叫endwin()。否則會出現不輸入字元這個函式
也會返回的情況。
3.在不同平臺,輸入回車,getch()將返回不同數值,而getchar()統一返回10(即\n)
1)windows平臺下ENTER鍵會產生兩個轉義字元 \r\n,因此getch返回13(\r)。
2)unix、 linux系統中ENTER鍵只產生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER鍵將產生 \r ,因此getch返回13(\r)。