使用 cin 更改二维字符串数组值
using cin to change a 2d string array value
const string astrDice[6][4]
{
{"M1" , "DM" , "AT" , "BK"},
{"M2" , "DM" , "BK" , "BK"},
{"M3" , "DM" , "BK" , "BK"},
{"M4" , "BK" , "AT" , "BK"},
{"M5" , "BK" , "AT" , "BK"},
{"M6" , "BK" , "AT" , "BN"}
};
cout << "Choose Side (1-6):";
int nSideChoice = 0;
cin >> nSideChoice; // will -1 later for ease of use to operator
cout << "Choose a Slot (1-4):";
int nSlotChoice = 0;
cin >> nSlotChoice; // will -1 later for ease of use to operator
cout << "Enter a New Value:";
string strNewSlot;
cin >> strNewSlot;
astrDice[nSideChoice - 1][nSlotChoice - 1] = strNewSlot;
在最后一行说 "No Viable Overloaded "="。我想使用 nSideChoice 和 nSlotChoice 来更改数组中的选择。我仍在学习如何编写基本代码,并且只知道一些 C++现在。这只是我一直在研究的一个测试程序,并且随着我学习新事物而不断变化。
看看这一行:const string astrDice[6][4]
astrDice是常量,不能修改!
编译器应该说类似 error: passing 'const string' as 'this' argument of 'something' discards qualifier
的内容。当您看到这样的消息时,通常意味着您遇到了常量问题。
No Viable Overloaded "="
不是有史以来最好的错误消息。它试图说 std::string 没有 const operator=()。嗯,呃。
尝试理解错误消息很重要,即使它们有时有点愚蠢。你会节省很多时间。
您的数组是const
,这意味着您无法在初始化后修改它。删除 const
限定符,您的代码应该可以工作。
由于此处的 const
限定符 const string astrDice[6][4]
,您将无法编辑此数组。是的,您可以将元素更改为 string astrDice[6][4]
但这真的是一个好的解决方案吗?
让我们看看这一行:
cout << "Choose Side (1-6):";
int nSideChoice = 0;
cin >> nSideChoice;
如果用户选择 7 会怎样?然后这里:astrDice[nSideChoice][nSlotChoice] = strNewSlot;
你将遇到严重的内存问题。考虑为此使用 std::vector
:
vector<vector<string>> astrDice =
{
{"M1" , "DM" , "AT" , "BK"},
{"M2" , "DM" , "BK" , "BK"},
{"M3" , "DM" , "BK" , "BK"},
{"M4" , "BK" , "AT" , "BK"},
{"M5" , "BK" , "AT" , "BK"},
{"M6" , "BK" , "AT" , "BN"}
};
cout << "Choose Side (1-6):";
int nSideChoice = 0;
cin >> nSideChoice;
cout << "Choose a Slot (1-4):";
int nSlotChoice = 0;
cin >> nSlotChoice;
cout << "Enter a New Value:";
string strNewSlot;
cin >> strNewSlot;
astrDice.at(nSideChoice).at(nSlotChoice) = strNewSlot;
这样你就可以避免数组越界的问题。
O_o
哇...确实
定义编写程序或主体函数的约束...
-> 您要求用户输入数值(体系结构位的有符号值:示例 32 位)
-> 这不是您要求的代码需要 1-6 和后来的 1-4 之间的范围值
-> 你自己计算数组的矩阵维数(是矩阵还是向量的向量)
---> vector of vector 不要对每个向量的长度添加约束,矩阵添加它
---> 不确定时,使用 slicer ,简单胜过复杂
-> 关键地址应该由地图容器处理而不是矢量
不管你使用什么语言,只要在编码的一开始就具体化并处理约束。
此外 STD::CIN 容易出错...这是一种非常基本的低级机制来读取值(peek、get、readsome 和 ignore 在很多方面对菜鸟都是有害的)几乎 99% 的人想要一个用于输入的正则表达式控件。
#include <iostream>
#include <regex>
#include <string>
#include <map>
#include <valarray>
using namespace std;
const int IHM_MAXREAD_LOOP= 3;
const int BLCK_SIDE= 6;
int main()
{
valarray<string> astrDice= // deserialized matrix
{"M1" , "DM" , "AT" , "BK"
,"M2" , "DM" , "BK" , "BK"
,"M3" , "DM" , "BK" , "BK"
,"M4" , "BK" , "AT" , "BK"
,"M5" , "BK" , "AT" , "BK"
,"M6" , "BK" , "AT" , "BN"
};
map<int,valarray<string> > astrDice;
for(int i=0;i<BLCK_SIDE;++i) astrDice[i]=data[slice(i, BLCK_SIDE, 1)]; // adding constraint on block size , remove constraint on index
string in1,in2, readyparse;
smatch match;
regex re("[1-6] [1-4]");
int maxtry;
for( maxtry = IHM_MAXREAD_LOOP; !regex_match(readyparse, match, re) && maxtry>0 ; maxtry--)
{
cout << "Choose Side (1-6):";
cin >> in1;
cout << "Choose a Slot (1-4):";
cin >> in2;
readyparse = in1+" "+in2;
}
if(maxtry<=0)
{
cout << "Run only with 1 2 3 4 5 or 6 for Side and 1 2 3 or 4 for Slot " << std::endl;
}else {
cout << "Enter a New Value:";
cin >> astrDice[atol(in1.c_str())-1][atol(in2.c_str())-1];
}
}
const string astrDice[6][4]
{
{"M1" , "DM" , "AT" , "BK"},
{"M2" , "DM" , "BK" , "BK"},
{"M3" , "DM" , "BK" , "BK"},
{"M4" , "BK" , "AT" , "BK"},
{"M5" , "BK" , "AT" , "BK"},
{"M6" , "BK" , "AT" , "BN"}
};
cout << "Choose Side (1-6):";
int nSideChoice = 0;
cin >> nSideChoice; // will -1 later for ease of use to operator
cout << "Choose a Slot (1-4):";
int nSlotChoice = 0;
cin >> nSlotChoice; // will -1 later for ease of use to operator
cout << "Enter a New Value:";
string strNewSlot;
cin >> strNewSlot;
astrDice[nSideChoice - 1][nSlotChoice - 1] = strNewSlot;
在最后一行说 "No Viable Overloaded "="。我想使用 nSideChoice 和 nSlotChoice 来更改数组中的选择。我仍在学习如何编写基本代码,并且只知道一些 C++现在。这只是我一直在研究的一个测试程序,并且随着我学习新事物而不断变化。
看看这一行:const string astrDice[6][4]
astrDice是常量,不能修改!
编译器应该说类似 error: passing 'const string' as 'this' argument of 'something' discards qualifier
的内容。当您看到这样的消息时,通常意味着您遇到了常量问题。
No Viable Overloaded "="
不是有史以来最好的错误消息。它试图说 std::string 没有 const operator=()。嗯,呃。
尝试理解错误消息很重要,即使它们有时有点愚蠢。你会节省很多时间。
您的数组是const
,这意味着您无法在初始化后修改它。删除 const
限定符,您的代码应该可以工作。
由于此处的 const
限定符 const string astrDice[6][4]
,您将无法编辑此数组。是的,您可以将元素更改为 string astrDice[6][4]
但这真的是一个好的解决方案吗?
让我们看看这一行:
cout << "Choose Side (1-6):";
int nSideChoice = 0;
cin >> nSideChoice;
如果用户选择 7 会怎样?然后这里:astrDice[nSideChoice][nSlotChoice] = strNewSlot;
你将遇到严重的内存问题。考虑为此使用 std::vector
:
vector<vector<string>> astrDice =
{
{"M1" , "DM" , "AT" , "BK"},
{"M2" , "DM" , "BK" , "BK"},
{"M3" , "DM" , "BK" , "BK"},
{"M4" , "BK" , "AT" , "BK"},
{"M5" , "BK" , "AT" , "BK"},
{"M6" , "BK" , "AT" , "BN"}
};
cout << "Choose Side (1-6):";
int nSideChoice = 0;
cin >> nSideChoice;
cout << "Choose a Slot (1-4):";
int nSlotChoice = 0;
cin >> nSlotChoice;
cout << "Enter a New Value:";
string strNewSlot;
cin >> strNewSlot;
astrDice.at(nSideChoice).at(nSlotChoice) = strNewSlot;
这样你就可以避免数组越界的问题。
O_o 哇...确实
定义编写程序或主体函数的约束...
-> 您要求用户输入数值(体系结构位的有符号值:示例 32 位) -> 这不是您要求的代码需要 1-6 和后来的 1-4 之间的范围值 -> 你自己计算数组的矩阵维数(是矩阵还是向量的向量) ---> vector of vector 不要对每个向量的长度添加约束,矩阵添加它 ---> 不确定时,使用 slicer ,简单胜过复杂 -> 关键地址应该由地图容器处理而不是矢量
不管你使用什么语言,只要在编码的一开始就具体化并处理约束。
此外 STD::CIN 容易出错...这是一种非常基本的低级机制来读取值(peek、get、readsome 和 ignore 在很多方面对菜鸟都是有害的)几乎 99% 的人想要一个用于输入的正则表达式控件。
#include <iostream>
#include <regex>
#include <string>
#include <map>
#include <valarray>
using namespace std;
const int IHM_MAXREAD_LOOP= 3;
const int BLCK_SIDE= 6;
int main()
{
valarray<string> astrDice= // deserialized matrix
{"M1" , "DM" , "AT" , "BK"
,"M2" , "DM" , "BK" , "BK"
,"M3" , "DM" , "BK" , "BK"
,"M4" , "BK" , "AT" , "BK"
,"M5" , "BK" , "AT" , "BK"
,"M6" , "BK" , "AT" , "BN"
};
map<int,valarray<string> > astrDice;
for(int i=0;i<BLCK_SIDE;++i) astrDice[i]=data[slice(i, BLCK_SIDE, 1)]; // adding constraint on block size , remove constraint on index
string in1,in2, readyparse;
smatch match;
regex re("[1-6] [1-4]");
int maxtry;
for( maxtry = IHM_MAXREAD_LOOP; !regex_match(readyparse, match, re) && maxtry>0 ; maxtry--)
{
cout << "Choose Side (1-6):";
cin >> in1;
cout << "Choose a Slot (1-4):";
cin >> in2;
readyparse = in1+" "+in2;
}
if(maxtry<=0)
{
cout << "Run only with 1 2 3 4 5 or 6 for Side and 1 2 3 or 4 for Slot " << std::endl;
}else {
cout << "Enter a New Value:";
cin >> astrDice[atol(in1.c_str())-1][atol(in2.c_str())-1];
}
}