0

我正在为我的学校项目使用 turbo c++。我知道它很老了,我应该使用代码块或 MVC++,但我只是将它用于学校的简单程序。好的,我的问题是我无法打印出 char 数组。这是我的简单代码

#include <iostream.h>
#include <conio.h>

class abc
{
    private:
            int rno,m1,m2,tot;
            char sname[10],grade;
    public:
            void getinput()
            {
                cout<<"Enter roll no:"<<endl;
                cin>>rno;
                cout<<"\nEnter mark 1:"<<endl;
                cin>>m1;
                cout<<"\nEnter mark 2:"<<endl;
                cin>>m2;
                cout<<"\nEnter student name:"<<endl;
                cin>>sname;
                cout<<endl;
                // Getting the returns.
                //tot = gettotal();
                //grade = getgrade();
            }

            void gettotal()
            {
                tot = m1+m2;
                // Returning the total to getinput's "tot" part.
                //return (tot);
            }

            void getgrade()
            {
                if(tot >= 150)
                {
                    grade = 'A';
                }
                else if(tot >= 100)
                {
                    grade = 'B';
                }
                else
                {
                    grade = 'C';
                }
                // Returning the total to getinput's "grade" part.
                //return (grade);
            }

            void display()
            {
                cout<<sname<<"'s total grade ranks: "<<grade;
            }
 };


 void main()
 {
    abc a;
    a.getinput();
    a.gettotal();
    a.getgrade();
    a.display();
 }

如您所见,它要求标记 1 和标记 2,然后计算它并根据标记打印“A”、“B”和“C”。

好的,所以我想要打印'First','Second'和'Third'而不是A,B,C。

有人可以帮助我吗?

谢谢。

4

3 回答 3

1

试试这个方法:

enum Grade{
    A,
    B,
    C,
};

const char * GetGradeStr(Grade grade){
    switch(grade){
    case A:return "First";
    case B:return "Second";
    case C:return "Third";
    }
}

char sname[10];
Grade grade;

...
    grade = A;

...
    cout<<sname<<"'s total grade ranks: "<<GetGradeStr(grade);

这将grade变成一个枚举,这意味着只有3个值是有效值,然后将正确的字符串作为“字符串文字”返回

于 2013-01-14T10:26:39.230 回答
1

也许我可以添加一些东西,让你更清楚。您需要了解 char 数组和指针之间的区别。指针只是一个指向内存中某个区域的变量。您可以malloc将地址存储并存储到 a char*- 这将类似于 char 数组。但不一样。

char 数组(以及 C/C++ 中的任何数组)在编译时必须具有已知大小。然后编译器将静态“分配”这个内存,而不是在运行时通过mallocor分配new。该数组现在可以隐式转换为 a char*- 例如,当您打印它时会发生这种情况。看下面的代码:

char* foo = "Hello world";

这实际上是这样的:

// Compiler generated "global constant",
// somewhere in your executable
const char fooString[] = "Hello world";

char* foo = fooString;

对于您在代码中使用的每个字符串文字,编译器都会生成这样一个“全局常量”。通过分配给一个 char 指针,指针现在指向该常量的内存地址,因此可以打印它、索引它(foo[2])、复制它等。

如果您使用 char 数组,编译器还将在编译时分配空间。char sname[10]例如,将导致类的每个对象包含abc10 个字符的内存(除了其他成员等)。现在,当您sname在代码中引用时,它的类型将为char[10],但可以(隐式)转换为achar*`指向数组中的第一个字符。现在让我们看看下面的代码:

grade = "First";
grade = "Second";
grade = "Third";

如果我们记得字符串文字被转换为全局常量,它实际上类似于以下内容:

const char[] str1 = "First";
const char[] str2 = "Second";
const char[] str3 = "Third";

grade = str1;
grade = str2;
grade = str3;

正如您现在可能猜到的那样,如果是 char 指针,这将很好地工作grade:它只会指向常量字符串文字之一,然后可以用于打印它等。但是如果grade是数组,编译器会看到来自的赋值char*to char[]- 这是不可能的。但可以使用strcpy- 为什么?因为strcpy将 char 指针作为参数。因此,编译器会将 char 数组隐式转换grade为指向其第一个元素的指针,并将其传递给strcpy.

于 2013-01-14T10:55:15.323 回答
0

您已将Grade定义为char而不是char *。请将其更新为char *然后您可以分配这些值,例如“First”等

编辑

#include <iostream.h>
#include <conio.h>

class abc
{
    private:
            int rno,m1,m2,tot;
            char sname[10];
            char * grade;
    public:
            void getinput()
            {
                cout<<"Enter roll no:"<<endl;
                cin>>rno;
                cout<<"\nEnter mark 1:"<<endl;
                cin>>m1;
                cout<<"\nEnter mark 2:"<<endl;
                cin>>m2;
                cout<<"\nEnter student name:"<<endl;
                cin>>sname;
                cout<<endl;
                // Getting the returns.
                //tot = gettotal();
                //grade = getgrade();
            }

            void gettotal()
            {
                tot = m1+m2;
                // Returning the total to getinput's "tot" part.
                //return (tot);
            }

            void getgrade()
            {
                if(tot >= 150)
                {
                    grade = "First";
                }
                else if(tot >= 100)
                {
                    grade = "Second";
                }
                else
                {
                    grade = "Third";
                }
                // Returning the total to getinput's "grade" part.
                //return (grade);
            }

            void display()
            {
                cout<<sname<<"'s total grade ranks: "<<grade;
            }
 };


 int main()
 {
    abc a;
    a.getinput();
    a.gettotal();
    a.getgrade();
    a.display();
 }
于 2013-01-14T10:04:35.290 回答