天天看點

c++讀取字元串和字元的6種函數

綜述:

字元串或字元的輸入有好多個函數,scanf、getline()、cin.getline()、cin.get()、gets()、getchar()等

  • 如果輸入是不帶空格的字元串,那用什麼都可以了,建議用scanf或cin
  • 如果輸入帶空格,那scanf、cin就用不了了,可以考慮以下方法:
    • 如果想用string類型的話,就用getline(cin, s)
    • 如果想用字元數組類型的話,可以用**cin.getline()、cin.get()、gets(),**這裡不是特别建議用gets(),因為這個函數可能會出點奇怪的問題,也不建議用cin.get(), 因為這個函數既不能忽略緩沖區的換行符,還不能在輸入後抹掉自己的結束符,建議使用cin.getline()
  • 如果輸入的時候是單個字元,或者隻想要字元串的第一個字元,就可以用getchar()、cin.get()

cin和cin.get都會将結束符或換行符留在緩沖區,而除cin外的函數都不能忽略緩沖區的結束符,是以如果用了cin,再用他們的時候記得加上getchar

scanf

scanf用于字元串數組,遇到空格或換行就停止

char str[10];
scanf("%s", str);
cout<<str<<endl;
           

getline()

可以接受空格,讀取時遇到換行符結束

有兩種讀取方法,法一是string流,法二是iostream流,是兩個不一樣的函數

方法一:

使用string

string str;
getline(cin, str);
cout<<str<<endl;
           

方法二:

使用字元串數組

char str[100];
cin.getline(str, 20, '\n')
//cin.getline()裡面三個參數,第一個是要儲存的字元串數組,第二個是最大長度 + 1,最後一個位置用來存儲'\0',也就是說你填20,但是隻能存前19個字元,第三個是結束符,可省略,預設是換行符
           

注意⚠️

程式的輸入都建有一個緩沖區,每次輸入的過程,其實是計算機先将輸入的資料存在輸入緩沖區中,而我們使用的輸入函數是直接從緩沖區中讀取資料。使用cin的時候,遇到空格和換行符和tab鍵就會停止,此時緩沖區就會有殘留資料:空格、換行符、tab。cin和cin.get()從緩沖區讀入的時候會自動忽略第一個空格、換行符、tab,就可以正常讀入字元串,但有些函數并不能,比如 getline,gets,get, 他們就會直接讀取緩沖區剩餘的空格、換行符、tab,就導緻需要輸入的輸不進去。

是以如果你使用getline()或gets()或者cin.get()之前用了cin或cin.get(),請務必在cin後面加個getchar();

//法一
string s, ss;
cin>>s;
getchar();
getline(cin, ss);
cout<<ss<<endl;

//法二
string s;
char ss[20];
cin>>s;
getchar();
cin.getline(ss, 20);
cout<<ss;
           

get()

讀取字元串時用法同getline()的第二種用法

與getline()的差別是cin.get()會将結束符或換行符殘留在輸入緩沖區中,而getline不會,是以使用get後如果還要用除cin外的輸入函數,就得加一個getchar()

char s[100];
cin.get(s, 10);
           

讀取字元時

char c;
c = cin.get();
           

還可以和getchar一樣讀走緩沖區中不要的字元

gets()

字元串數組

char s[10];
gets(s);
           

gets和getline一樣,不會将結束符或換行符留在緩沖區,不過如果緩沖區有結束符或換行符,他也會讀進去,是以在前面要加個getchar()

char s[10];
gets(s);
cout<<s<<endl;
           

也可以用于二維字元數組

char s[3][10];
    for(int i = 0; i < 3; ++i){
        gets(s[i]);
    }
    for(int i = 0; i < 3; ++i){
        cout<<s[i]<<endl;
    }
           

getchar()

getchar()會從緩沖區讀走一個字元,如果輸入多個字元,也隻會讀取第一個

繼續閱讀