如何从char *获取2d int数组?

时间:2011-07-21 08:43:20

标签: c++ integer

我想将2d int数组传递给main函数。 由于主要功能签名是这样的     int main(int argc, char*argv[] 如何在代码中将2d数组放入int[][]

命令行:     myprogram {{2,3},{5,6},{4,5},{6,8},{2,5}}

3 个答案:

答案 0 :(得分:5)

这:{{2,3},{5,6},{4,5},{6,8},{2,5}}将以程序中的字符串结尾。您需要自己将其分解为多个数组。

答案 1 :(得分:0)

main()函数不带任何内容或命令行参数为char * s - 你不能随便给它任何东西!您必须解析char *以获取所需的数据。

你是否必须以这种方式输入信息?如果它是这样输入的(只是通过cin,而不是命令行参数:

1 2 3
4 5 6
7 8 9

您可以使用以下内容将其分配给int a[][]

int main() 
{
    const int X=3, Y=3;
    int a[X][Y];
    string currentLine;

    for(int i = 0; i != X; ++i) {
        getline(cin, currentLine);
        istringstream currentInput(currentLine);
        for(int j = 0; j != Y; ++j)
            currentInput >> a[i][j];
    }

    return 0;
}

答案 2 :(得分:0)

您需要解析为程序提供的命令行输入。这可能会涉及到一点点。

你可以做的是 - 因为你知道那个阵列将是一个2D阵列。 传递命令行输入,如下所示:

myprogram<行数(r)> <列数(c)> n_1 n_2 n_3 .... n_(r * c)

其中n是“行主要”方式的数组元素。

通过这种方式,您可以更简单地编写读取命令行输入的代码。

否则,如果要保留输入格式。您必须构建一个“小”解析器来读取这些输入。基本上你需要处理5种“字符”:

  1. 右支撑'}'
  2. 左大括号'{'
  3. 数字[0-9]
  4. 逗号','
  5. space''
  6. 处理空间会有点棘手,因为命令行中的每个space输入argc都会增加一个。

    修改 你可以遵循这些方针。 NB:此代码可能有错误,还需要检查一些逻辑,但这可以作为您开始以您给出的格式解析命令行输入的起点。

    int main()
    {
    int count = 1;
    std::vector<vector<int>> arr2d;
    std::vector<int> arr1d;
    std::string buf;
    while(count<argc) {
      //accumulate what all you get from command line into string
      buf += argv[count];
      count++;
    }
    std::string curr_num;
    int num_elements;
    int i = 0;
    int lparen=0,rparen=0,nrows=0;
    char c;
    while(i<buf.length()){
      c = buf[i];
      switch(c) {
      case '{':
        lparen++;
        break;
      case '}':
        rparen++;
        nrows++;
        arr2d.push_back(arr1d);
        arr1d.clear();
        break;
      case ' ':
        break;
      case ',':
        num_elements++;
        if(curr_num.length() != 0) {
          //i'm not sure this will work but you have to do something similar
          arr1d.push_back((int)curr_num.c_str());
        }
        else {//do some error handling}
      case '0':
      //....
      case '9':
        curr_num += buf[i];
      break;
      default:
      //throw error;
      //there might be other checks you may feel like doing 
      //you'll get better idea as you start writing on your own.
    }
    i++;
    }
    if(lparen || rparen)
      //throw error ...
     //...
    return 0;
    }