30/09/2018, 16:12

[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 ‘ ’) 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
Người Cô Đơn viết 18:28 ngày 30/09/2018

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

Thực tế khắc nghiệt viết 18:24 ngày 30/09/2018

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

TTmagic viết 18:15 ngày 30/09/2018

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ỉ ?

Thực tế khắc nghiệt viết 18:21 ngày 30/09/2018

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ỉ ?

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

TTmagic viết 18:14 ngày 30/09/2018

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

Thực tế khắc nghiệt viết 18:26 ngày 30/09/2018

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é đâu ai nỡ thấy sai mà để vậy coi sao được

viễn đông viết 18:19 ngày 30/09/2018

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

maivanquan viết 18:17 ngày 30/09/2018

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

maivanquan viết 18:19 ngày 30/09/2018

@Honey_moon giúp em với

Nguyễn Văn Tâm viết 18:22 ngày 30/09/2018

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

maivanquan viết 18:23 ngày 30/09/2018

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!

Nguyễn Văn Tâm viết 18:29 ngày 30/09/2018

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ỉ

maivanquan viết 18:27 ngày 30/09/2018

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,

maivanquan viết 18:26 ngày 30/09/2018

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

Tô Đình Vin viết 18:14 ngày 30/09/2018

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

Công Tuyền Lê viết 18:24 ngày 30/09/2018

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 !??

rogp10 viết 18:14 ngày 30/09/2018

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ỉ?

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.

Công Tuyền Lê viết 18:16 ngày 30/09/2018

đú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 ạ

Bài liên quan
0