C/C++ 字符數組的輸入輸出

字符數組就是char數組,當維度是一維是可以當做“字符串”,當維度是二維時可以當成是字符串數組,即若干字符串。字符數組的輸入除了使用scanf外,還可以使用getchar或者gets;其輸出除了使用printf外,還可以使用putchar或者puts。

(1)scanf輸入,printf輸出

scanf對字符串的輸入有%s和%c兩種格式。%c格式用來輸入單個字符,它能夠識別空格和換行符並將其保存到字符數組中;%s格式用來輸入一個字符串,它通過空格和換行來識別一個字符串的結束。也就是說使用%s格式輸入並保存到字符數組中的字符串是不含空格的。下面是一個實例:

  1. <span style=“font-size:18px;”>#include <stdio.h>  
  2. int main(){  
  3.     char str[10];  
  4.     scanf(”%s”, str);  
  5.     printf(”%s”, str);  
  6.     return 0;  
  7. }</span>  
#include <stdio.h>
int main(){
    char str[10];
    scanf("%s", str);
    printf("%s", str);
    return 0;
}

輸入字符串“abc def ghi”,輸出的結果爲“abc”。可以看到,%s識別空格作爲字符串的結尾,因此第一個空格後面的字符都不會被讀入。

(2)getchar輸入,putchar輸出

getchar和putchar分別用來輸入和輸出單個字符。getchar可以識別換行符和空格並將其保存。下面是一個例子:

  1. <span style=“font-size:18px;”>#include <stdio.h>  
  2. int main(){  
  3.     char c1, c2, c3;  
  4.     c1 = getchar();  
  5.     c2 = getchar();  
  6.     c3 = getchar();           
  7.     putchar(c1);  
  8.     putchar(c2);  
  9.     putchar(c3);  
  10.     return 0;  
  11. }</span>  
#include <stdio.h>
int main(){
    char c1, c2, c3;
    c1 = getchar();
    c2 = getchar();
    c3 = getchar();         
    putchar(c1);
    putchar(c2);
    putchar(c3);
    return 0;
}

在這裏我們如果輸入“a“,然後敲回車,然後輸入”bc“,再敲回車,輸出的結果會是這樣:

a


b

這是由於getchar可以識別換行符,所以c2實際上存儲的是換行符,因此字符c沒有被存入,字符ab之間會有一個換行出現。

(3)gets輸入,puts輸出

gets用來輸入一行字符串並將其存放於一維數組(或二維數組的一維)中,讀取字符串直到換行符結束,但換行符會被丟棄,然後再末尾添加‘\0’,它與scanf(”%s“, s)相似,但不完全相同,gets可識別空格並將其輸入。puts函數會自動換行。下面是一個例子:

  1. <span style=“font-size:18px;”>#include <stdio.h>  
  2. int main(){  
  3.     char str1[20];  
  4.     char str2[5][10];  
  5.     gets(str1);  
  6.     for(int i = 0; i < 3; i ++){  
  7.         gets(str2[i]);  
  8.     }  
  9.     puts(str1);  
  10.     for(int i = 0; i < 3; i ++){  
  11.         puts(str2[i]);  
  12.     }  
  13.     return 0;  
  14. }</span>  
#include <stdio.h>
int main(){
    char str1[20];
    char str2[5][10];
    gets(str1);
    for(int i = 0; i < 3; i ++){
        gets(str2[i]);
    }
    puts(str1);
    for(int i = 0; i < 3; i ++){
        puts(str2[i]);
    }
    return 0;
}
輸入下面幾個字符串:

abc def

QAQ

T_T

WoAiNi

這幾個字符串都可以原樣輸出,因爲gets可以識別空格並將其保存到字符串中。另外需要注意的是,gets函數會無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執行讀取操作時不會發生溢出。如果溢出,多出來的字符會被寫入到堆棧中,這就覆蓋了堆棧原有的內容,破壞一個或多個不相關變量的值。

發佈了54 篇原創文章 · 獲贊 58 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章