[Từ chương trình quản lý sv]. Đến đoạn nhập tên sinh viên thì chương trình bỗng dừng lại không cho thực hiện tiếp việc nhập năm sinh và điểm trung bình. cho mình hỏi là sai chỗ nào ở đoạn code này vậy
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
struct sinhvien{
string hoten;
int namsinh;
float diemtb;
}sv[500];
void nhap(){
int m;
string mystr;
cout<<"nhap so hoc sinh can nhap: ";
cin>>m;
cout<< "nhap ttsv: ";
for(int i=0;i<m;i++){
cout<< "\nho ten sinh vien: ";
getline(cin,sv[i].hoten);
cout<< "nam sinh: ";
getline(cin,mystr);
stringstream(mystr)>>sv[i].namsinh;
cout<< "diem trung binh: ";
getline(cin,mystr);
stringstream(mystr)>>sv[i].diemtb;
}
}
int main(){
nhap();
return 0;
}
Không thể nhập tiếp năm sinh và điểm trung bình sau khi nhập tên sinh viên
m là cái gì hả bạn???
m là số sv cần nhập
Cái quan trọng là bạn đã khai báo m đâu?
t khai báo rồi nhưng mà viết thiếu thôi
t vừa sửa lại rồi mà
Nếu bạn đọc xâu sv[i].hoten
có dấu cách, hãy dùng getline. Khi bạn nhập string có dấu cách, C++ sẽ hiểu là các từ các nhau và nhập vào các biến đằng sau. Tỉ dụ như
nhap so sinh vien: 3
nhap ttsv:
ho ten sinh vien: me me me // đây là 3 từ -> 'me' đầu tiên vào sv[i].hoten,
// 'me' thứ 2 vào sv[i].namsinh,
// 'me' thứ 3 vào sv[i].diemtb
// và tất nhiên 2 'me' sau không thể nhập vào .namsinh và .diemtb được
nam sinh: diem trung binh: // trôi lệnh...
ho ten sinh vien: nam sinh: diem trung binh:
ho ten sinh vien: nam sinh: diem trung binh:
Mình không nhớ là trong C++ có kiểu này
struct sinhvien{
string hoten;
int namsinh;
float diemtb;
}sv[500];
tớ dùng getline rồi vẫn bị như vậy. có phải cú pháp là: getline(cin,sv[i].hoten) không
Đúng rồi…
Mình không biết bạn biên dịch bằng IDE nào mà nó vẫn pass được (nên thay IDE khác, hoặc config lại)
Bạn chưa khai báo thư viện cho lớp string
<cstring>
là của C để xử lí char
, không liên quan gì đến string
của C++
ref: http://www.cplusplus.com/reference/cstring/
C++ là <string>
struct
của C++ cũng không khai báo thế kia, như @53k41iga nói
vậy bạn thử đi xem có được k. t không làm được
vậy khai báo struct kiểu gì bạn
Bạn nên khai báo tách bạch ra. Một cái khai báo kiểu dữ liệu, một cái khai báo mảng sv
Lỗi của bạn là do bạn chưa #include <string>
Khai báo struct nó không khác gì bạn khai báo các biến thông thường.
Lập trình C++ thì nên viết rõ ràng, đừng gộp hết vào như C, nhìn rất …
struct sinhvien
{
// ...
};
sinhvien sv[500];
t vẫn chưa hiểu bạn ơi
Code sau khi sửa tất cả những thứ râu ria bên cạnh:
#include <iostream>
#include <string>
using namespace std;
struct sinhvien{
string hoten;
int namsinh;
float diemtb;
};
sinhvien sv[500];
void nhap(){
int m;
cout<<"nhap so sinh vien: ";
cin>>m;
cin.ignore();
cout<< "nhap ttsv: ";
for(int i=0;i<m;i++){
cout<< "\nho ten sinh vien: ";
getline(cin, sv[i].hoten);
cout<< "nam sinh: ";
cin>>sv[i].namsinh;
cout<< "diem trung binh: ";
cin>>sv[i].diemtb;
cin.ignore();
}
for(int i=0; i<m; i++) cout << sv[i].hoten << " | " << sv[i].namsinh << " | " << sv[i].diemtb << endl;
}
int main(){
nhap();
return 0;
}
Thêm cin.ignore()
là ngon ngay.
Bonus ảnh demo:
ok. cảm ơn bạn. nhưng mình muốn hỏi thêm là sao lại dùng cin.ignore()
Khi bạn nhập m, kiểu gì cũng có 1 kí tự endline ở cuối dòng nhập m. Kiểu như
nhap so sinh vien: 4\n // 4 là giá trị của m, nhưng còn dư 1 kí tự endline
// do bạn đã nhấn enter
Do vậy, dấu \n sẽ bị đọc vào sv[i].hoten. Khi in ra sv[i].hoten, kết quả là rỗng.
1 cách dễ nhớ, đọc số xong mà phải đọc string ở dòng dưới thì tốt nhất dùng cin.ignore()
.
Đọc thêm: link
hey joe, i think it’s not as you said. my basic learning about c++ generally is very well