[Wiki] Hàm nhập chuỗi, ký tự getline trong C/C++

Hàm getline

  • Khi sử dụng phải khai báo thư viện string.

Đối với C++ :

  • cấu trúc :
getline(std::cin,<bien>);
  • Định nghĩa : thuộc lớp namespace std. Có chức năng nhận các thông tin từ bàn phím qua hàm ( std::cin ) sau đó chuyền vào biến chỉ định.
    ví dụ : Hãy xuất ra ngoài 1 biến trong đó sở hữu tên của bạn từ bàn phím.
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string ten;
    cin.ignore();  // thêm vào để xoá bộ nhớ đệm, tránh bị trôi lệnh
    cout<<"Nhap ten cua ban :  "<<endl;
    getline(std::cin,ten);
    cout<<"xin chao ban "<<ten<<" den voi ngon ngu lap trinh c/c++!!!"<<endl;
    return 0;
}
  • Lời khuyên : hàm getline sử dụng dưa trên việc thông qua lưu trữ giá trị hàm cin nhận vào. Ở đây cin chỉ nhận từng lần nhập liệu sau đó sẽ kết thúc khi gặp khoảng trắng hay xuống hàng. vì thế getline lưu trư toàn bộ thông tin và truyền vào biến.
  • Lưu ý : Việc sử dụng hàm getline có thể gây mất biến khi nhấn enter nghĩa là nếu bạn tạo 1 biến có giá trị số sau đó bạn getline và in 1 chuỗi ký tự.
  • Nên xoá bộ nhớ đệm trước khi getline để tránh lỗi.
std::fflush(stdin);

###C

  • Thư viện < stdio.h>
  • cấu trúc ssize_t getline(char ** ptr, size_t *n,FILE * stream);
  • Trong C thì nó sẽ đọc 1 dòng. Nếu *n < số kí tự( bao gồm ‘\n’) thì nó sẽ gọi realloc *ptr và thay đổi *n.
  • giá trị trả về là số kí tự được đọc. Hoặc nếu có lỗi sẽ trả về -1
16 Likes

Hay á.Đúng cái đang cần.Mình đang tính chạy thử so sánh hàm getline với hàm gets nhưng tắm cái đã. ^^! Thanks bạn

nếu thấy hay thì cùng tạo ra nhiều thư viện nhỏ như này đi heng. hỳ hỳ! welcome!!!

2 Likes

không nhầm thì hàm getline làm việc với biến kiểu string, còn gets làm việc với biến kiểu con trỏ hoặc mảng ký tự, đúng k nhỉ ?

2 Likes

wiki lên có thể sửa nhé ! hỳ hỳ :smiley: mọi người cùng hoàn thiện mà

câu hỏi và câu trả lời không liên quan =))

thấy sai hay thiếu xót thì mọi ng có quyền sửa nhé :sunny: đâu ai nỡ thấy sai mà để vậy coi sao được

Thank bạn đã chia sẽ nhé
Mình viết socket cho client/server mà không hiểu hàm này.hihi

mọi người ơi, sao em dùng hàm cin.getline toàn bị lỗi ấy, ngẫm nghĩ 1 ngày rồi mà ko ra vấn đề , mn chỉ em, em dùng visual studio
đây là code ạ

#include <iostream>
#include <conio.h>
#include <iomanip>
#include <string.h> 
using namespace std;

typedef struct hanghoa
{
    int stt;
    int soluong;
    int dongia;
    int thanhtien;
};
hanghoa  x;

void main()
{
    int n,i;
    cout << "so luong hang hoa can nhap:" << endl;
    cin >> n;
    for(i=0;i<n;i++)
    {
        cout << "stt:";
		fflush(stdin);
		std::cin.getline(x.stt,n);//cai n này là gì ạ, em ko hiểu lắm, thấy mẫu nên cứ làm theo
        cout << "so luong:";
		cin.getline(x.soluong,n) ;
        cout << "don gia:";
		cin.getline(x.soluong,n);
		x.thanhtien=x.dongia*x.soluong;
		cout << "thanh tien:"<< x.thanhtien << endl ;
      }
    cout << "danh sach hang hoa:" << endl;
    cout<<setiosflags(ios::showpoint)<<setprecision(4);
    for(i=0;i<n;i++)
    {
        cout.setf(ios::left);
            cout << "|" << setw(5) << x.stt ;
            cout << "|" << setw(7) << x.soluong;
            cout << "|" << setw(7) << x.dongia;
            cout << "|" << setw(7) << x.thanhtien << "|" << setw(4) << endl;

    }
	system("pause");
}

nó hiện lỗi này ạ
Error: No instance of overloaded function “std::basic_istream<_Elem,_Traits>::getline[with_Elem=char,_Traits=std::char_traits]” matches the argument list"
em cảm ơn :smile:

@Honey_moon giúp em với :wink:

cin.getline sao lại đọc vào biến x kiểu int. cin.getline( char* , int size ) chứ

1 Like

woah, mình muốn hiển thị kết quả ra theo kiểu
| “stt” | “soluong” | “đơn giá” | thành tiền " |
theo kiểu danh sách ấy. nếu dùng kiểu khác int thì mình ko biết dùng kiểu dữ liệu gì để có thể dùng phép tính " x.thanhtien=x.dongia*x.soluong; "
help me!

Nhập dữ liệu cho biến int thì dùng cin chứ. cin>>x.stt , mà sao có 1 biến struct x mà lai dùng for nhỉ :unamused:

1 Like

biến đó dùng để gọi các biến trong struct mà, nếu dùng thằng cin thì cái bảng kết quả của mình nó chỉ hiển thị 1 list toàn giá trị của mặt hàng nhập cuối cùng thôi,

thank bạn @sanegan199x nhá , hehe, mình đã hiểu ra và sửa thành công :smile:

có bạn nào chỉ mình cách chiaw class trong dev c++ ko

hai cái xóa bộ nhớ đệm là fflush(stdin); và cin.ignore(); giống và khác nhau như thế nào nhỉ? vì mình để fflush(stdin); thì nó trôi lệnh không getline được, nhưng thay bằng cin.ignore(); thì lại có thể getline được !??

cin.ignore() là chuẩn (lưu ý: viết ntn không triệt để), còn fflush(stdin) không phải chuẩn, và đã bị rút bỏ khỏi VS 2015 trở về sau.

2 Likes

đúng rồi ạ! e đang dùng VS 2017 fflush(stdin) không thể dùng được.
@rogp10 e hỏi thêm nếu viết triệt để là như thế nào luôn ạ

vậy làm sao để nhập số sau khi nhập chuỗi ạ?

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