【问题标题】:How can i get coordinates in C++?如何在 C++ 中获取坐标?
【发布时间】:2026-02-17 01:30:01
【问题描述】:

我想在一行中得到坐标x y

xchar 类型 [aj] 包括 aj ; yint 类型 [110] 包括 110 .

示例: cout>>"Enter coordinates ex[e4] then press enter/n";

用户应该写:d5 并按回车键。

然后我必须将两个输入字母(字符)和数字分开。

我认为这可以通过getlinegetchar 来完成

有人可以向我解释这是否可行以及如何做到这一点?

请注意,一对字母编号(不含空格,例如:f3)必须为两个不同的函数分开,一个基于char类型,另一个基于int类型

感谢您的所有回答。别担心,你没有解决我的作业,我正在编写一个小型海战游戏 :-) 我不知道该怎么做,我所知道的只是学习经验。

这里是代码:这个函数检查char的值:

    int nx;
    nx=x; //Trasfromazione char x in int (NumeroX)
    switch(x) {
        case 97 ... 106:{ //Codice ascii a,b,c...
            return true;
            break;
        }
    default:{
        cout<<"\n---Lettera non valida\a\n\n";
        return false;
        break;
    }
    }
} 

这个函数检查int的值:

bool checknum(int y){
    bool v=false;
    switch(y) {
        case 1 ... 10 :{
            v=true;
            break;
        }
    default:{
        cout<<"\n---Numero non valido\a\n\n";
        return false;
        break;
    }
    }
    return v;   
}

这是调用两个函数的代码:

do{
    cout<<"\n-Inserisci lettera numero\n>";
    cin>>x>>y;
}while(((checknum(y))==false) or((checklett(x))==false) );

如果我的输入是两个字母,这会导致一个永恒的循环

05-02-2020 dd-mm-yyyy 为@Tedlyngmo 编辑

使用此代码,它似乎可以工作:

do{
    cout<<"\n-Inserisci lettera e numero\n>";
    cin>>x>>y;
    cin.clear();    
}while((checklett(x)==false)or(checknum(y)==false));

你知道为什么吗?

【问题讨论】:

  • 使用std::cin 的最天真的方法应该可以工作。请出示您的代码
  • 1/ 获取一个字符串作为输入。 2/ 将字符串拆分为一个字母字符和一个数字字符。 3/ 编写函数将它们转换为您可能想要的整数索引
  • @Useless 为什么这么复杂? istream 可以为你做所有这些
  • 它可以做 1 和 2,当然。问题是 OP 似乎没有意识到 3 是一个单独的步骤,并且未能将他们的问题分解为可实现的块。
  • 感谢您的所有回答。别担心,你没有解决我的作业,我正在编写一个小型海战游戏 :-) 我不知道该怎么做,我所知道的只是学习经验。

标签: c++ char int coordinates


【解决方案1】:

您可以使用任何std::istream(如std::cin)的格式化输入功能。

#include <iostream>

int main() {
    char letter;
    int number;

    if(std::cin >> letter >> number) {
        std::cout << "success. got letter " << letter << " and number " << number << '\n';
    } else {
        // failure
    }
}

编辑:当std::cin 进入失败状态时,更新后的问题现在会显示问题。这是清除该状态并丢弃仍在缓冲区中的垃圾字符的一种方法。

#include <iostream>
#include <limits>

// A function template to read a value from a stream and to validate it
template<typename T>
bool get_val(std::istream& is, T min, T max, T& out) {
    if(is >> out) {
        return out >= min && out <= max;
    }
    return false;
}

int main() {
    char letter;
    int number;

    while(true) {
        std::cout << "Enter coordinates: ";
        if(get_val<char>(std::cin, 'a', 'j', letter) &&
           get_val<int>(std::cin, 1, 10, number))
        {
            // success
            break;
        } else {
            // failure
            if(std::cin.eof()) {
                // end of file, the user is not there anymore
                std::cout << "Abort...\n";
                return 1;
            }
            std::cout << "Invalid input\n";
            // clear error state
            std::cin.clear();
            // clear input buffer to newline
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }

    std::cout << "Got letter " << letter << " and number " << number << '\n';
}

【讨论】:

  • 这显然不是一个你不应该用工作代码回答的家庭作业问题吗?
  • 感谢您的所有回答。别担心,你没有解决我的作业,我正在编写一个小型海战游戏 :-) 我不知道该怎么做,我所知道的只是学习经验
  • @TedLyngmo 非常感谢您!我将您的答案标记为最佳,但我不会使用您的代码。因为这是我的游戏,我想自己编程。我知道你的代码比我的好,我尊重你,但我所有的知识都来自仅仅一年的学习经历。我们学习了函数,没有别的。我不认为我可以用函数来做到这一点,所以我保持原样。如果您想查看我所有的代码,那可能是您见过的最糟糕的代码啊哈哈哈哈。还是谢谢老哥!对不起我的英语=)
  • @saporedisale 欢迎您! SO 上的大部分代码在这里只是为了展示一些选项、激发一些想法或阐明某些东西是如何工作的。所以,选择你喜欢的部分并跳过其余部分。 :-)
  • @TedLyngmo cin.ignore 在这种情况下没用吗?可能在cin&gt;&gt;x&gt;&gt;y 之前或之后
【解决方案2】:

你可以这样做:

std::cout << "Enter coordinates ex[e4] then press enter/n";
char x;
int y;
std::cin >> x >> y;

【讨论】:

  • 这显然不是一个你不应该回答的家庭作业问题吗?
  • @0xbaadf00d a) 你怎么知道这是作业? b) 为什么你认为不应该回答有关家庭作业的问题?
  • @0xbaadf00d 这个问题的问题不在于它是作业。问题是 OP 显然不费吹灰之力就自己找到答案,而且完全不清楚他们面临什么问题
  • a) 这对我来说似乎很明显,没有人会编写这种软件 b) 他们可以而且应该得到回答,但不是用工作代码。
  • @0xbaadf00d 我不想让讨论继续下去,只要考虑到元帖子中接受的答案还说:“不要对真诚回答家庭作业问题的其他人投反对票,即使他们打破了这些准则”。如果您认为这个问题不应该回答,只需标记它并继续;)
【解决方案3】:

实现您所要求的一个简单方法是通过在char[2] 中读取带有cin 的输入,因此该字母将存储在char[0]char[1] 中的数字,或者您可以将其读取分隔变量,char 存储字母,int 存储数字:

int main()
{
    char s[2];
    // In a char array
    printf("Enter coordinates: ");
    std::cin >> s;

    // In separated char and int variables
    char a;
    int b;
    printf("Enter coordinates: ");
    std::cin >> a >> b;
    return 0;
}

【讨论】:

  • @0xbaadf00d 为什么不呢?没有这样的规定!这个问题缺乏质量,但不是因为它是家庭作业。关于作业的问题没有错
  • “如果您认为这对学生没有帮助,最好不要提供完整的代码示例,使用您的最佳判断。” meta.*.com/questions/334822/…
  • @0xbaadf00d 我完全同意这个说法,但恕我直言,它适用于学生应该解决的问题。然而,这里的问题是 OP 没有打开一本书来阅读获取用户输入的最基本示例。我认为不提供答案没有任何价值
  • 感谢您的所有回答。别担心,你不是在解决我的作业,我在编写一个小海战游戏:-)
  • @Ted Lyngmo 现在我不会写了。如果你愿意,我今晚会向你解释。谢谢
【解决方案4】:
std::string str;
std::getline(std::cin, str);
std::cout << str; 

然后用你的字符串做你想做的事,例如https://en.cppreference.com/w/cpp/string/basic_string/stol 从第一个字母开始

【讨论】:

  • 感谢您的所有回答。别担心,你没有解决我的作业,我正在编写一个小型海战游戏 :-) 我不知道该怎么做,我所知道的只是学习经验。
  • 当涉及到问题时,“我必须将两个输入字母(字符)和数字分开。[...] 有人可以向我解释一下这是否可行以及如何做到这一点?”,我认为这没有多大帮助