我正在为我的学校项目使用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。
请有人帮我解决这个问题。
感谢。
答案 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 ++中的任何数组)在编译时必须具有已知大小。然后,编译器将静态“分配”此内存,而不是通过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个字符的内存(除了其他成员等)。现在,当您在代码中引用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}}是一个数组,编译器看到从grade
到char*
的赋值 - 这是不可能的。但是有可能使用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();
}