我正在制作一个吸引学生的项目。姓名,滚动号码和根据用户的需要标记和返回百分比或等级。我创建了一个使用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]);
}
答案 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 >> ...
) - 因为它们仍然以不同方式处理换行符。