[英]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 ++中的任何數組)在編譯時必須具有已知的大小。 然后,編譯器將靜態地“分配”該內存,而不是在運行時通過malloc
或new
分配。 現在可以將該數組隱式轉換為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.