我如何在 C++ 中获取坐标?

How can i get coordinates in C++?

我想在一行中获取坐标 x y

但是 xchar 类型 [aj] 包括ajyint 类型 [110] 包括 1 10

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

用户应输入:d5 并按回车键。

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

我认为这可以用 getlinegetchar

来完成

有人可以向我解释一下这是否可行以及如何实现吗?

请注意,一对 字母编号(没有 space 例如: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::string str;
std::getline(std::cin, str);
std::cout << str; 

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

实现您所要求的一个简单方法是通过在 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;
}

您可以这样做:

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

您可以使用任何 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';
}