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

2 Likes

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 ^^

5 Likes

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

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.

3 Likes
  • 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
5 Likes

ý 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

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

Mình không ép được kiểu char sang string. Nó pops out error:

Error C2665: 'std::getline': none of the 2 overloads could convert all the argument types
Error E0304:	no instance of overloaded function "getline" matches the argument list

khi dùng getline(cin,(string)strHo); như bạn. Mình include string file vào rồi. Bạn giúp mình với. Thanks nhiều

Chắc ông trên chưa test rồi :slight_smile: làm sao mà chạy được, dù ổn thì nó nhập vào cái string nào ấy chứ có vào mảng đâu. Cả hai câu đều có vấn đề.

Mà sao lại dùng std::getline cho char* nhỉ, phương thức nó tự cắt cho mình mà.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?