我如何在 C++ 中获取坐标?
How can i get coordinates in C++?
我想在一行中获取坐标 x y。
但是 x 是 char
类型 [a 到 j] 包括a 和 j ; y 是 int
类型 [1 到 10] 包括 1 和 10。
示例:
cout>>"Enter coordinates ex[e4] then press enter/n";
用户应输入:d5 并按回车键。
然后我必须将两个输入字母(字符)和数字分开。
我认为这可以用 getline
或 getchar
来完成
有人可以向我解释一下这是否可行以及如何实现吗?
请注意,一对 字母编号(没有 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';
}
我想在一行中获取坐标 x y。
但是 x 是 char
类型 [a 到 j] 包括a 和 j ; y 是 int
类型 [1 到 10] 包括 1 和 10。
示例:
cout>>"Enter coordinates ex[e4] then press enter/n";
用户应输入:d5 并按回车键。
然后我必须将两个输入字母(字符)和数字分开。
我认为这可以用 getline
或 getchar
有人可以向我解释一下这是否可行以及如何实现吗?
请注意,一对 字母编号(没有 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';
}