我对结构有疑问。我试图让用户输入一个字母并让计算机返回两个值。这就是我现在所拥有的:
#include <iostream>
struct coords{
int coordsx1;
int coordsy1;
} a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;
int main()
{
char first;
int coordsx1;
int coordsy1;
a.coordsx=0; e.coordsx=0; i.coordsx=0; m.coordsx=0;
b.coordsx=1; f.coordsx=1; j.coordsx=1; n.coordsx=1;
c.coordsx=2; g.coordsx=2; k.coordsx=2; o.coordsx=2;
d.coordsx=3; h.coordsx=3; l.coordsx=3; p.coordsx=3;
cin >> first;
coordsx1= first.coordsx; // this is the part that doesn't work
}
例如,如果用户输入&#39; d&#39;对于变量首先,我希望计算机将coordsx1的值设置为等于3并将coordsy1设置为等于0(我还没有完成coordsy1部分)。 此外,这是为用户输入返回多个值的好方法吗?
答案 0 :(得分:2)
用户在cin >> first
中输入的内容是文本,它存储在first
中,即char。这是一个包含字符的变量,而不是名称为包含字符的变量,这就是它不起作用的原因。
C ++没有将变量的文本表示转换为变量名所需的自反能力,但您可以使用链式if
显式转换,或者更方便地使用switch
进行转换。 :
switch(first)
{
case 'a':
coordsx1 = a.coordsx;
coordsy1 = a.coordsy;
break;
case 'b':
coordsx1 = b.coordsx;
coordsy1 = b.coordsy;
break;
case 'c':
coordsx1 = c.coordsx;
coordsy1 = c.coordsy;
break;
// All other cases
default:
std::cerr << "Wrong input" << std::endl;
}
或者,您可以简单地将数据放入数组中并使用字符对其进行索引,这也使数据初始化更具可读性:
#include <iostream>
struct Coords
{
int x;
int y;
};
Coords coords[3] = {
{ 1, 2 }, // a
{ 2, 3 }, // b
{ 3, 4 }, // c
};
int main(int arg, char** argv)
{
char first;
int coordsx1;
int coordsy1;
std::cin >> first;
if (first > 'c' || first < 'a')
{
std::cerr << "Wrong input" << std::endl;
return 1;
}
int index = first - 'a'; // Convert 'a' into 0, 'b' into 1, etc.
coordsx1 = coords[index].x;
coordsy1 = coords[index].y;
}
答案 1 :(得分:1)
Ups: - )
首先,您必须了解运行时中的字符不是编译时的变量定义!
你从cin得到的是一个角色,因为你做了
char first;
所以如果你想从这个输入中选择你的输出,你必须编写一系列case语句,如:
switch ( first ) {
case 'a': coordsx1=a.coordsx; coordsy1=a.coordsy; break;
case 'b': coordsx1=b.coordsx; coordsy1=b.coordsy; break;
... a lot more ...
default: std::cerr << "Unknown value entered" << std::endl;
}
请看一下std :: vector或std :: map。在这个用例中,这两个容器都可以提供很多帮助!