30/09/2018, 17:55

Hỏi về sự khác nhau giữa getline và cin.getline trong C++

Chào các anh(chị, bạn)
Em đang thắc mắc 1 vấn đề nhỏ giữa hàm getline và cin.getline trong c++ như sau:
đầu tiền e có 1 chương trình sau:

#include <iostream>
#include <string>
using namespace std;

main()
{
	string strTen;
	char strHo[50];
	char cKitu;
	int iTuoi;
	cout <<"Nhap tuoi   ";
	cin>> iTuoi;
	cout <<"Nhap ki tu   ";
	cin.ignore(1);
	cin.get(cKitu);
	cout <<"Nhap ten   ";
	fflush(stdin); 
	getline(cin, strTen); 
	cout <<"Nhap ho   ";
	cin.getline(strHo,5);
	cout <<"Tuoi  "<<iTuoi<<endl<<"Ki tu  "<<cKitu<<endl<<"Ten  "<<strTen<<endl<<"Ho  "<<strHo<<endl;
	system("pause");
	return 0;
}

trong chương trình có 2 biến

string strTen;
char strHo[50];

vấn đề e muốn hỏi là
biến strTen được khai báo với kiểu dữ liệu string
( trong khai báo header string đã có typedef cho kiểu dữ liệu xâu nhưng e k biết nó typedef bao nhiêu phần tử cho xâu và cũng k rõ lắm về header string typedef như thế nào ?)
khi dùng biến strTen với lênh sau thì vẫn ổn

getline(cin, strTen); 

(chép hết dữ liệu từ stdin vào biến strTen)
nhưng khi dùng biến strTen với lênh sau khi không được

cin.getline(strTen,5);

(cho phép nhập 5-1 kí tự vào xâu strTen)
và ngược lại
với biến strHo được khai báo char strHo[50]; thì dùng với lệnh sau thì ổn

cin.getline(strHo,5);

nhưng dùng với lệnh

`getline(cin, strHo);

thì lại k được
kết: tại sao với biến khai báo :

#include <string>
string strTen;

thì chỉ dung được với

getline(cin, strTen);

không dùng được với cin.getline(strTen,5);
và ngược lại
với khai báo biến char strHo[50];
thì chỉ dùng được với cin.getline(strHo,5);
không dùng được với getline(cin, strHo);
sự khác nhau ở đây là gì?
tiện thể giải thích giúp e trong header string nó làm gì trong đó luôn ạ
XINCAMON

*grab popcorn* viết 19:57 ngày 30/09/2018

Ngay trong reference của c++ cũng có nói rồi

getline(ifstream& is, string& s)

istream& getline (char* s, streamsize n );

Một cái chỉ dùng đc cho string,
còn 1 cái dùng cho char.
Thật ra cái getline(cin,string) là hàm đc overload lại từ hàm kia ^^

abcxyz viết 20:00 ngày 30/09/2018

chỉ đơn giản là nó quy định 1 cái dùng cho string 1 cái dùng cho char à, bạn nói rõ hơn được không?
ban có thể nói thêm về header string được không?
tks bạn

*grab popcorn* viết 20:11 ngày 30/09/2018

header string là cái thư viện <string> đó bạn
Còn 2 hàm trên đơn giản là hàm lấy các kí tự trên buffer đến khi gặp kí tự dừng (delim) thì nó dừng lại. Mặc định là kí tự \n
Đối với cin.getline() thì nó hơi khác tí là nó phải có giới hạn. Khi quét đủ giới hạn rồi thì dừng.

Nguyễn Hữu Điền viết 19:57 ngày 30/09/2018
  • Phương thức cin.getline:
    istream& cin.getline(char *str, int n, char delim = '\n')
    Đọc dãy ký tự tính cả khoảng trắng vào bộ nhớ do str trỏ tới, quá trình đọc kết thúc khi gặp ký tự kết thúc chuỗi '\0' hoặc nhận đủ n-1 ký tự, ký tự Enter được loại bỏ không đưa vào dãy ký tự nhận được
  • Ép kiểu
    cin.getline((char *)strTen.c_str(), 20); // Ép kiểu string sangchar
    getline(cin, (string)strHo); //Ép kiểu char sang string
abcxyz viết 20:02 ngày 30/09/2018

header string là cái thư viện <string> đó bạn

ý mình hỏi trong header này nó typedef như thế nào, kiểu dữ liệu string được khai báo ? phần tử …v.v.v.v ấy

abcxyz viết 20:04 ngày 30/09/2018

Phương thức cin.getline: istream& cin.getline(char *str, int n, char delim = ‘\n’)Đọc dãy ký tự tính cả khoảng trắng vào bộ nhớ do str trỏ tới, quá trình đọc kết thúc khi gặp ký tự kết thúc chuỗi ‘\0’ hoặc nhận đủ n-1 ký tự, ký tự Enter được loại bỏ không đưa vào dãy ký tự nhận được
Ép kiểucin.getline((char *)strTen.c_str(), 20); // Ép kiểu string sangchargetline(cin, (string)strHo); //Ép kiểu char sang string

(Y) tks bạn, rất chi tiết

Bài liên quan
0