我看到了一些处理类似错误的线程,但它们都处理了与我所遇到的问题不同的问题(代码是:“我太绿了,无法理解它们”)。
#include <iostream>
#include <array>
#include <sstream>
using namespace std;
struct StudentRecord
{
char name[20];
int id;
float gpa;
};
int main()
{
cout << "Enter your name:" << endl;
char nameInput[20];
cin >> nameInput;
cout << "Enter your student ID:" << endl;
int idInput;
cin >> idInput;
cout << "Enter your GPA:" << endl;
float gpaInput;
cin >> gpaInput;
StudentRecord TESCStudent =
{ { nameInput }, idInput, gpaInput }; // TROUBLE STARTS HERE
cout << "Name: " << TESCStudent.name << "\nID: " << TESCStudent.id << "\nGPA: "
<< TESCStudent.gpa << endl;
}StudentRecord TESCStudent ={.}初始化程序会产生以下错误:错误C2440:‘初始化’:不能从'char 20‘转换为'char’IntelliSense:不能使用"char *“类型的值来初始化"char”类型的实体。
我意识到字符串可以解决很多问题,但是这个项目要求我们获得一个20个字符数组的名称。
这是我第一次使用结构,所以我可能做了一些可怕的事情,没有意义,请对我轻松!
发布于 2016-05-09 00:56:54
你写道:
StudentRecord TESCStudent = { { nameInput }, idInput, gpaInput };
基本上:你不能那样做。C样式数组具有不直观的语法和语义;除了单独列出每个元素之外,没有任何方法可以使用另一个C样式数组初始化C样式数组的元素。
我的建议是根本不使用它们。如果您使用的是std::string而不是名称数组,那么只需编写StudentRecord TESCStudent = { nameInput , idInput, gpaInput };。这还可以解决代码在输入长度为20个字符或更长的名称时会导致缓冲区溢出的问题。
如果您由于课程要求而被迫使用char数组,那么我建议通过直接读取数组并添加溢出保护和错误检查来避免这个问题,例如:
StudentRecord TESCStudent = {};
cout << "Enter your name:" << endl;
cin >> setw(sizeof(TESCStudent.name)) >> TESCStudent.name;
cout << "Enter your student ID:" << endl;
cin >> TESCStudent.id;
cout << "Enter your GPA:" << endl;
cin >> TESCStudent.gpa;
if ( !cin )
{
cout << "Invalid input, sorry.\n";
return EXIT_FAILURE;
}发布于 2016-05-07 21:20:53
@yinch正确地指出,我将idInput视为一个值而不是数组。将其写成:
StudentRecord TESCStudent = { { *nameInput }, idInput, gpaInput };
移除错误,但只将第一个值从nameInput[20]添加到TESCStudent.name[20]。我决定将以下值添加到TESCStudent中:
StudentRecord TESCStudent; // create a variable from StudentRecord
cout << "Enter your name:" << endl; // prompt for name
char nameInput[20];
cin >> nameInput;
for( size_t i = 0; i < 20; i++ ) // assign each element of nameInput
// to TESCStudent.name explicitly
{
TESCStudent.name[ i ] = nameInput[ i ];
}
cout << "\nEnter your student ID:" << endl; // prompt for ID
int idInput;
cin >> idInput;
TESCStudent.id = idInput; // assign idInput to TESCStudent.id
cout << "\nEnter your GPA:" << endl; // prompt for GPA
float gpaInput;
cin >> gpaInput;
TESCStudent.gpa = gpaInput; // assign gpaInput to TESCStudent.gpa
for循环通过显式地将每个数组值分配给TESCStudent.name来解决这个问题。谢谢你的帮助!
发布于 2016-05-06 23:19:41
将问题线更改为:
StudentRecord TESCStudent =
{ { *nameInput }, idInput, gpaInput };解决问题。
关于字符串,需要记住的是,它们本身就是数组。因此,在您的示例中,"nameInput“本身并不包含char值,它实际上持有指向第一个char值的指针。
区分变量(保存值)和指针(是指向值所在位置的地址指针)是字符串和其他文字值(如int和float)之间区别的关键部分。
通过用星号预先固定nameInput (指针),表示您想要指向的值。
https://stackoverflow.com/questions/37082518
复制相似问题