1. 程式人生 > >C與C++中字串的輸入

C與C++中字串的輸入

ps可以用來接受gets(name)的返回值,如果讀入成功,就返回字串地址,這時ps就是name的地址。如果讀入不成功,name還是原先地址,但ps變成了NULL。

3、fgets()
需要制定最大字元讀入數,是為檔案I/O設計的,處理鍵盤輸入時不如gets()方便。
(1)它需要第二個引數來指定最大讀入字元數。如果讀入字元數達到這個值,或者遇到一個換行度,就停止讀入;
(2)如果遇到換行符,該換行符將被讀入字串,再在換行符前加一’\0’;
(3)還需要第三個引數指定讀哪個檔案。如果是從鍵盤上讀入資料,就用stdin。
(4)該函式返回一個char型指標,指向字串(首字元)地址
例子:
1)標準輸入
    char name[80];
    char *ptr;
    ptr=fgets(name,81,fp);
    printf("name: %s,  ptr: %s\n",name,ptr);
2)從檔案讀入
    FILE *fp=fopen("E:\\code\\wordcopys.txt","r");
    char name[80];
    char *ptr;
    ptr=fgets(name,81,fp);
    printf("name: %s,  ptr: %s\n",name,ptr);
這裡要特別注意的是,"E:\\code\\wordcopys.txt"一定要用\\,不能用一個\.
另外,要注意的是,name字串除了’\0’,最後一個字元是換行符。
還有一點要注意的是:scanf會忽略前面所有的空白字元,但gets和fgets不會。


二、字串的輸出
1、printf (“%s”,name);
name是字串的地址。
2、puts()
給出字串的地址即可,與printf不同的是,這個函式會在字串後面自動新增換行符。
注意,我們並不一定要給一個字串的首地址,只要是一個char型地址就行,函式會從這個地址的字元開始輸出,直到遇到空字元’\0’。
3、fputs
是puts的面向檔案版本,兩者之間的主要差別是:
(1)fputs需要第二個引數來說明要寫的檔案,如果輸出到螢幕上,就用引數stdout;
(2)fputs不會自動新增換行符。

注意,gets()會丟掉換行符,但puts()會自動新增換行符;
fgets()會加上換行符,但fputs()不會新增換行符。
所以,如果將fgets()和puts()一起使用,將會輸出兩個換行符;
如果將gets()和fputs()一起使用,將不會輸出後將不會換行(一個換行符也沒有)。

printf也不會自動新增換行符,且要鍵入更多程式碼,但是這個函式使得在一行上輸入多個字串更為簡便。

最後,我們可以根據需要,用上述函式建立適合自己的輸入、輸出函式。

示例1:gets()函式1
char *str1;
if(gets(str1)==NULL)
    printf("Nothing!");
如果我們輸入ctrl+Z,沒有問題,會輸出Nothing!
但是當我們輸入其它任何字元(包括直接回車),都會提示出錯。原因是,str1是一個沒有初始化也沒有賦值的指標,所以不能給他輸入任何字元。
這裡大家可能要問,“gets()函式以換行符作為結束的標記”,也就是說,我既然直接輸入換行符,那不就是什麼也沒輸入,為什麼也不可以呢?注意,這時,系統會認為你輸得是一個空字串,因此,會自動給你加一個’\0’。也就說,我們等於是在一個未賦值的指標中存了一個空字元。
那麼,為什麼輸入ctrl+Z可以呢?因為ctrl+Z是真正告訴系統我什麼都沒輸入,包括空字串,因此,不會放任何東西在那裡。


示例2:gets()函式2
char str1[NUM];
gets(str1);
if(str1==NULL)
    printf("Nothing!");
我們不管輸入什麼,即使是ctrl+Z,也不會列印任何東西出來,也就是說,str1都不是NULL。
說明:
str1是陣列名,而這個陣列名和指標變數不同的是,宣告系統會自動為其分配記憶體,不管我們輸入什麼,這個地址都是實實在在分配好了的,所以永遠不會為NULL。當我們輸入ctrl+Z時,只是告訴系統我沒有向這個記憶體放任何東西,事實上,這個記憶體有可能有一些資料,是原先就有的、沒有清楚的垃圾。當然,即使這塊記憶體是空的也無所謂,我們這個NULL不是說你這裡存沒存東西,而是看你到底有沒有指定記憶體。
事實上,這時gets函式會返回一個NULL,但返回值並不是賦給str1的。