注册 登录
编程论坛 C++教室

在主函数中,为什么我的for不能结束循环?还会出现死循环?

林家的姑娘 发布于 2016-10-18 22:56, 5109 次点击
#include<iostream.h>
#include<string.h>
//日期类
class Date
{
    public:
        int year,month,day;
    Date(int y=2000,int m=1,int d=1)    //构造函数,日期
    {
        year=y;
        month=m;
        day=d;
    }
    void showday( )
    {
        cout<<year<<"."<<month<<"."<<day<<endl;
    }

};
int Num=0;//全局变量
class Teacher//老师类
{
public:
    int  num;//编号
    char name[10];//名字
    char sex[2];//性别

    Date birthday;//成员生日
    Teacher(char name[],char [],int Num,int y,int m,int d);//构造函数,名字,
    int getnum( );
    void show( );


};

Teacher::Teacher(char n[], char s[],int Num,int y,int m,int d):birthday(y,m,d)//构造函数
{
    Num++;
    num=Num;
    strcpy(name,n);
    strcpy(sex,s);
}
void Teacher::show( )
{
    cout<<"编号,名字,性别"<<endl;
    cout<<num<<":"<<name<<" "<<sex<<endl;
    cout<<"生日:"<<endl;
    birthday.showday( );
}

int  Teacher::getnum()//成员函数,编号
{
   
    return num;
}




void main()
{

    char name[10],sex[2];
    char A[2]=A;
    int year,month,day;
    for(int i=0; ;i++)
 {

        cout<<"请输入姓名:"<<endl;
        cin>>name;
       if(name==A)
           break;

        cout<<"请输入性别:"<<endl;
        cin>>sex;

        cout<<"请输入生日:"<<endl;
        cin>>year>>month>>day;
   
        Teacher  t1(name,sex,Num,year,month,day);//调用构造函数
        t1.show( );
 }
}


[此贴子已经被作者于2016-10-18 23:01编辑过]

10 回复
#2
U2010100092016-10-19 10:12
给你个C++Primer中文版的书看看,里面很详细(这是我的360云盘分享的)
https:// (提取码:3631)
#3
wp2319572016-10-19 10:15
  if(name==A)  这个有问题吧
#4
鸿蒙之灵2016-10-19 11:00
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。

再者  char A[2]=A;  这一句楼主想要干什么,是将A作为数组元素赋值给A[2]数组中的第一个,即达到A[0]=‘A’的效果??你这编译能通过?

for(int i=0; ;i++)  和  if(name==A)break;搭配控制循环,本身就不够严谨,如果你的 name 永远都 !=A ,你的循环怎么结束?而事实上,你的name是指向大小为10的数组name[10],你的A是指向大小为2的数组A[2],指向不同大小,不同存储空间的两个数组的指针,无论你输入的姓名是不是A,if(name==A)的值都不会是真,而你的for语句循环控制语句中,第二句为空语句,结合上面的两点,你的程序会出现死循环。
#5
rjsp2016-10-19 15:19
char A[2]=A;
这能编译通过?
#6
yangfrancis2016-10-20 21:19
如果希望那个A是常量的话要先自己定义才行。
#7
lin_jun_cai2016-10-21 09:19
程序都没能编译通过
#8
starlz2016-10-24 22:45
新手的建议,提问题一定要先把问题描述清楚,大神们才能知道你想要干什么。。。这么呼啦上来一堆,咋看啊
#9
笨笨笨A梦2016-10-26 10:49
不会出现死循环吧!
#10
starlz2016-10-26 16:16
#include<iostream>
#include<string>
using namespace std;
class Date
{
    int year, month, day;
public:
    Date() :year(2000), month(0), day(0){}
    Date(int y, int m, int d){ year = y; month = m; day = d; }
    friend istream &operator>>(istream &is, Date &d){ is >> d.year >> d.month >> d.day; return is; }
    friend ostream &operator<<(ostream &os, Date &d){ os << d.year << "." << d.month << "." << d.day; return os; }
};
class Teacher
{
public:
    static int num;
    string name;
    string sex;
    Date birthday;
    Teacher(){};
    void setteacher();
    void showteacher();
};
int Teacher::num = 0;
void Teacher::setteacher()
{
    cout << "input:teache's name,sex,birthday" << endl;
    cin >> name >> sex >> birthday;
    num++;
}
void Teacher::showteacher()
{
    cout << num << name << sex << birthday << endl;
}
void main()
{
    Teacher t;
    t.setteacher();
    t.showteacher();
}
#11
StadyC2016-10-31 12:01
你想比较两个C风格字符串是否相等吧?那应该用strcmp(str1, str2);而不是直接==比较
if(strcmp(str1, str2) == 0)    //两字符串相等
1