使用 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];
    }
}