C ++ Char数组不起作用

时间:2018-08-08 23:39:28

标签: c++

我正在尝试使该程序正常运行,但输出奇数。我知道在这里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缓冲区,但不知道为什么会遇到这种损坏。 谢谢!

2 个答案:

答案 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');
  1. 您的int被读取并存储在a
  2. cin现在包含您按\n
  3. 后剩余的Enter
  4. getline立即尝试将其读入s,但将其丢弃,s现在为空,但是getline操作已完成。
  5. 为什么仍要等待名称输入?因为cin.ignore正在等待输入\n或至少10个char,但是流缓冲区现在为空。
  6. 您输入名称,然后按Enterignore至少得到其\n并已完成,但是您输入的字符串不会存储在任何地方。它只是被忽略。如果不忽略它,您将在输出中获得此字符串的第一个char,但您没有。

长话短说,您的输入已损坏。输入\n之前的第一个数字后,应清除getline。只有到那时,将名称存储在s中之后,您才可以尝试将其传递给函数,将指针传递给空数组并期望其起作用没有任何意义。