[C++] cin空白换行输入处理

前言

有時候,我們在使用cin時 可能會遇到想要輸入的字串中,包含空白、換行、tab

但是這會造成讀取資料與顯示時,會有不完全存取。

cin 不會將換行字元 空白 tab鍵 讀入 這些空白都是拿來作為字串結束

接下來,讓我們看看下列範例:

cin範例


 

所以假設今天創了一個陣列 要讀入一行有空白間隔的字

char charry1[20]; 
cin >> charry1; 
cout << charry1 << endl; 

input : hello C++

會印出 hello

那"C++"這串字會在哪?

讓我們在往下看

char charry1[20]; 
char charry2[20]; 

cin >> charry1; 
cout << charry1 << endl; 
cin >> charry2 ; 
cout << charry2 << endl;

同上 input: hello C++

會印出:

hello

C++

其實剩下的"C++"這串字存到cin的buffer裡

所以當遇到 cin >> charry2 ; 這串code時(循序點)

會把之前存放在buffer的值放到charry2 所以才會出現這個結果

那麼要如何改善 空白的問題

有兩個方法:

解決方法:


 

getline() 和 get() 

而這裡個func的差別在哪? 兩者都會讀入空白,不過:

getline() => 不會將換行字元視為輸入值加以儲存

get() => 則會將換行字元視為輸入資料

1.使用getline

char name[10]; 
cout << "enter your name :"; 
cin.getline(name,10); //呼叫函數 ,10代表最大能讀入的字串長度 

input : jason <ENTER>

則讀入ENTER鍵時 會產生換行字元 並將他取代成null => |j|a|s|o|n|\0| | |..

2.使用get

char name[10];
char id[10];

cout << "enter your name :";
cin.get(name,10); //呼叫函數 10 是最大能讀入的字串長度
cin.get(id,10);
cout << "name :"<< name << endl;
cout << "id :"<< id << endl;

input :

enter your name : jason<ENTER>

則會看到:

name : jason

id :

因為get() 會將換行字元讀入 所以在ENTER按下後 前面的字串會放置程式的變數中

可是換行字元卻會被留在buffer中 等待下一次輸入時 讀入,因此就會被下一個cin.get吃進去

那要如何解決?

只要:

cin.get(name,10);
cin.get();
cin.get(id,10);

如此便可搞定

再來還有另一種方式表示:

直接下

 cin.get(name,10).get();

 這代表會回傳cin物件 然後以此物件再用作get函數的引數傳入

參考資料

<參考C++ primer plus 5/e>

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值