使用用户输入从结构返回多个值

时间:2014-05-21 06:37:31

标签: c++ struct

我对结构有疑问。我试图让用户输入一个字母并让计算机返回两个值。这就是我现在所拥有的:

#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部分)。 此外,这是为用户输入返回多个值的好方法吗?

2 个答案:

答案 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。在这个用例中,这两个容器都可以提供很多帮助!