gpt4 book ai didi

c++ - 变量自动分配

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:08 24 4
gpt4 key购买 nike

我正在制作一个项目,根据用户的需要获取学生的姓名、学号和分数,并返回百分比或等级。我使用 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]);
}

最佳答案

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

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

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

好的;这就是解释。怎么办?

解决方案是不要混合这些输入样式。一种选择始终使用面向行的输入来读取所有内容作为字符串,然后分别解析该字符串。

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

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

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

关于c++ - 变量自动分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50347934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com