簡體   English   中英

無法打印字符數組

[英]Cannot print char array

我在學校項目中使用的是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。

有人可以幫我嗎

謝謝。

試試這個方法:

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個值是有效值,然后將正確的字符串作為“字符串文字”返回

也許我可以添加一些內容,以使您更加清楚。 您需要了解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個char的內存(除了其他成員等)。現在,當您在代碼中引用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指針,這將很好地工作:它將僅指向常量字符串文字之一,然后可以將其用於打印等。但是,如果grade是一個數組,則編譯器會看到一個從char*char[]賦值-這是不可能的。 但是可以使用strcpy為什么呢? 因為strcpy將char指針作為參數。 因此,編譯器會將char數組grade隱式轉換為指向其第一個元素的指針,並將其傳遞給strcpy

您已將等級定義為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();
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM