无法打印char数组

时间:2013-01-14 10:00:39

标签: c++

我正在为我的学校项目使用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。

请有人帮我解决这个问题。

感谢。

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

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

char数组(以及C / C ++中的任何数组)在编译时必须具有已知大小。然后,编译器将静态“分配”此内存,而不是通过mallocnew在运行时分配。现在可以将此数组隐式转换为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]将导致类abc的每个对象包含10个字符的内存(除了其他成员等)。现在,当您在代码中引用sname时,它的类型将char[10],但它可以(隐式)转换为a char *`指向数组中的第一个char。现在让我们看看以下代码:

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

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

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

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

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

答案 2 :(得分:0)

您已将成绩定义为字符而非字符* 。请将其更新为 char * ,然后您可以分配这些值,例如&#39; First&#39;等

修改

#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();
 }