我正在尝试使该程序正常运行,但输出奇数。我知道在这里char缓冲区不是理想的,但是它是用于分配而不是我自己设计的。这是我的代码:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
//Place your class definition here
class student {
public:
void inputData(int a, char s[20], float e, float m, float sci);
void printData();
private:
int admno;
char sname[20];
float eng;
float math;
float science;
float total;
float ctotal();
};
int main () //This is your main driver. Do NOT make any changes to it
{
student obj ;
int a;
char s[20];
float e, m, sci;
cin >> a;
cin.getline(s,20);
cin.clear();
cin.ignore(10,'\n');
cin >> e;
cin >> m;
cin >> sci;
obj.inputData(a, s, e, m, sci);
obj.printData();
return 0;
}
//Place your class member function definitions here
void student::inputData(int a, char s[], float e, float m, float sci) {
admno = a;
*sname = *s;
eng = e;
math = m;
science = sci;
total = ctotal();
}
void student::printData() {
cout << "Admission number: " << admno << endl << "Student name: ";
for (int i = 0; i < 20; i++)
cout << sname[i];
cout << endl << "English: " << eng << endl << "Math: " << science << endl << "Science: " << science << endl << "Total: " << total;
}
float student::ctotal() {
return (eng + math + science);
}
这是我的输入内容:
98745
Kyle Smith
98
78
62
这是预期的输出:
Admission number: 98745
Student name: Kyle Smith
English: 98
Math: 78
Science: 62
Total: 238
这是实际输出:
Admission number: 98745
Student name: m ╩`uÄM■Å■ ║k`u
English: 98
Math: 62
Science: 62
Total: 238
请提供有关修复方法的建议。我必须坚持使用该char缓冲区,但不知道为什么会遇到这种损坏。 谢谢!
答案 0 :(得分:2)
*sname = *s;
这将复制一个字符,而不是整个字符串。如果要复制整个字符串,则需要使用https://my-project-flex.appspot.com
std::strcpy(sname, s);
或循环
char* src = s;
char* dst = sname;
while (src) {
*dst = *src;
++src;
++dst;
}
当然,您可以取消所有手动字符串处理,而使用std::strcpy
:
//Place your class definition here
class student {
public:
void inputData(int a, std::string s, float e, float m, float sci);
void printData();
private:
int admno;
std::string sname;
float eng;
float math;
float science;
float total;
float ctotal();
};
void student::inputData(int a, std::string s, float e, float m, float sci) {
admno = a;
sname = std::move(s);
eng = e;
math = m;
science = sci;
total = ctotal();
}
答案 1 :(得分:1)
发生了什么事
cin >> a;
cin.getline(s,20);
cin.clear(); // never mind this, doesn't do anything in this context
cin.ignore(10,'\n');
int
被读取并存储在a
cin
现在包含您按\n
Enter
getline
立即尝试将其读入s
,但将其丢弃,s
现在为空,但是getline
操作已完成。cin.ignore
正在等待输入\n
或至少10个char
,但是流缓冲区现在为空。 Enter
,ignore
至少得到其\n
并已完成,但是您输入的字符串不会存储在任何地方。它只是被忽略。如果不忽略它,您将在输出中获得此字符串的第一个char
,但您没有。长话短说,您的输入已损坏。输入\n
之前的第一个数字后,应清除getline
。只有到那时,将名称存储在s
中之后,您才可以尝试将其传递给函数,将指针传递给空数组并期望其起作用没有任何意义。