将int转换为char *

时间:2013-04-09 00:31:41

标签: c++ char int

我正在创建一个矩阵,它将与另一个矩阵相乘。 矩阵将从参数(* argv [])中获取值。

直到现在我创造了这样的东西:

for(int i=0; i<2; i++) {
       for(int j=0; j<2; j++) {
          sec[i][j]=argv[gv];
          gv++;
       }
    }

for(int i=0; i<2; i++) {
   for(int j=0; j<2; j++) {
      int a = (int)fir[i][j];
      int b = (int)sec[i][j];
      int r = a*b;
      res[i][j]=(char)(r); //the problem is here
   }
   cout<<endl;
}

问题是当我想显示矩阵时我的代码崩溃了。问题可能在标记的地方。

任何想法如何解决这个简单的问题? :)

提前致谢!

2 个答案:

答案 0 :(得分:3)

您询问的问题

由于您没有显示任何声明,我无法确定,但如果崩溃发生在指定位置,则很可能您没有为res预留足够的空间。你确定你这样声明了吗?

char res[2][2];

其他问题

我不确定你在第一个循环中想要做什么,但是如果标识符argv引用传递给main的参数,如:

int main (int argc, char *argv[])

argv将是一个指针数组,而不是这些字符串中包含的第一个字符值的数组。因此,您将为您的sec数组填充操作系统选择的或多或少的随机值以及它所遵循的ABI,以存储在该位置传递给您的函数的参数。

基本上你的设置如下:

                               +---------> "my_program"
 argv -> +--------------+     /              @ anywhere in memory
         | argv [0]    ------+
         +--------------+          +---->  "paramter argc-2"
         | argv [1]    ---------+ /          @ another location in memory
         +--------------+        \
         | ...          |      /   +-----> "paramter 1"
         +--------------+     /              @ some other location again
         | argv[argc-1] |----+
         +--------------+

虽然您正在执行计算的@个位置。

不要误解&lt;&lt;输出

使用

之类的结构

std :: cout&lt;&lt;的argv [1]

将产生与:

相同的输出

std :: cout&lt;&lt; 12

如果您使用12作为第一个参数调用您的程序,它们似乎或多或少相同,那么肯定不是!因为只是重载的<<使它们看起来几乎相同。

然而,当在类型为int的对象上运行时,<<在调用char*类型的对象时会切换很多不同的代码。

示例差异

您可能需要查看以下代码段以查看操作上的差异:

#include <iostream>
#include <stdio.h>

int main (int argc, char *argv[]) {
  int k;

  for (k=0; k<argc; ++k)
    std::cout << k << ": " << argv[k] << "\n";

  for (k=0; k<argc; ++k)
    printf ("%d: %d\n", k, (int) argv[k]);

  return 0;
}

使用./my_program 12 27 42运行生成的代码将生成如下输出:

0: ./my_program
1: 12
2: 27
3: 42

0: -1079747848
1: -1079747840
2: -1079747837
3: -1079747834 

相当不同,这是因为当面对char* <<类型的值时,“知道”它必须执行与面对类型{{{{ 1}}。

通过“告诉”第二个循环中的实现执行正确的操作:

int

您将从第二个循环中获得相同的输出。

第一个输出的奇怪数字只是解释了用于表示传递给main的参数指针的位模式,作为整数的那些(位模式)。

使用“无符号”进行类型转换并使用“%x”代替“%d”会使这更加明显,如下所示:

  for (k=0; k<argc; ++k)
    printf ("%d: %s\n", k, argv[k]);

正如你所看到的那样,我通过夸大记忆位置的随机性来“欺骗”我的照片。

如果计算在这个例子中你会找到的索引,操作系统只是一个接一个地放置参数(包括终止0: bf92bae9 1: bf92baf6 2: bf92baf9 3: bf92bafc 字符)。

答案 1 :(得分:0)

正如塞尔达利斯所说,如果你只是想输出int,那就没有必要转换它们了;只需将它们发送到cout即可。

int转换为char可能无法完成您想要的操作。 C中的char无论如何都是数值,它们按ASCII值转换。如果您决定将其转换为字符串,则可以使用itoa

itoa(r, res[i][j], 10);

这也假设reschar*的二维数组,我不知道,因为你没有提供声明。如果是,则需要在执行此操作之前动态分配它们。