变量将自动分配

时间:2018-05-15 10:28:20

标签: c++ for-loop

我正在制作一个吸引学生的项目。姓名,滚动号码和根据用户的需要标记和返回百分比或等级。我创建了一个使用for循环的函数来为变量分配细节(名称等)但是在更改for循环参数期间,程序正在为执行中的第一个变量分配""(null)部分。我在这里错过了任何代码吗?

#include <iostream>
#include <stdio.h>

using namespace std;

class Data 
{
    public: 
    int Rno[3], phy[3], mat[3], chem[3];
    char name[3][100];

    void getInfo()
    {
        for(int i = 0; i < 3; i++)
        {
            cout << "Enter your name: ";
            gets(name[i]);

            cout << "Enter your Roll number: ";
            cin >> Rno[i];

            cout << "Enter your Physics marks: ";
            cin >> phy[i];

            cout << "Enter your Maths marks: ";
            cin >> mat[i];

            cout << "Enter your Chemistry marks: ";
            cin >> chem[i];
       }
    };
};

int main()
{
    Data d;

    d.getInfo();
    puts(d.name[1]);
}

2 个答案:

答案 0 :(得分:0)

问题在于没有刷新cout。在你的情况下,在调用cout之前必须刷新循环gets

cout << "Enter your name: "<<endl;  // This cout should be flushed properly **with** new line character
gets(name[i]);

来自@ProXicT评论

cout << "Enter your name: "<<flush;  // This cout should be flushed properly **without** new line character
    gets(name[i]);

答案 1 :(得分:0)

首先解释一下。然后是解决问题的一些选择。

问题是您在同一输入设备/流上混合了面向行的输入(gets())和格式化输入(cin >> ....)。

这些函数以不同的方式处理空格 - 特别是换行符。而且,正因为如此,您可以获得意想不到的互动。在这种情况下,cin >> chem[i]将读取一个整数值,当遇到换行符时停止,让换行符等待读取。然后gets() - 在循环的下一次迭代中 - 将遇到换行符,并立即返回(因此为“null”,以使用您的描述)。

行;这是解释。该怎么办?

解决方案不是混合这种风格的输入。一个选项始终使用面向行的输入将EVERYTHING作为字符串读取,然后单独解析字符串。

有些人会建议涉及丢弃(或“冲洗”)违规换行的方法。如果您的输入很复杂(例如,许多不同的语句以不同的方式从同一个流读取),那么这种方法就不能正常工作,因为有必要确保丢弃每个杂散的换行符。它也容易出错 - 您可能无意中丢弃了程序需要阅读的输入。

同时避免像瘟疫那样使用gets()。它已经从最近的C标准中删除了一个原因 - 它本质上是不安全的。

有多种方法可以使用C ++流(如cin)来安全地读取字符串和其他类型。例如,如果some_str的类型为std::string,那么std::getline(std::cin, some_str)可用于读取完整的输入行。 std::getline()还具有可以读取任意大小的字符串的优点。但是,仍然避免在同一个流上使用std::getline(cin, some_str)和流式输入(cin >> ...) - 因为它们仍然以不同方式处理换行符。