int / char数组/字符串之间的差异

时间:2013-08-13 04:52:23

标签: c arrays string char int

我还是新来的论坛,所以我提前为论坛礼仪问题道歉。

我无法理解int数组和char数组之间的差异。

我最近编写了一个Project Euler问题的程序,该程序最初使用char数组来存储一串数字,后来调用了特定字符,并尝试对它们使用int操作来查找产品。当我使用char字符串时,我得到了一个非常大的产品,显然不正确。即使我将我认为将编译为字符(str[n])的内容转换为整数内联((int)str[n]),它也完全相同。只有当我实际使用整数数组时才有效。

代码如下

表示char字符串

char str[21] = "73167176531330624919";

这不起作用。我得到了大约1.5万亿的答案,答案应该是大约40k。

表示int数组

int str[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9};

这是有效的。我也脱掉了直线型铸件。

任何解释为什么这些事情有效/无效以及任何能够更好地理解这些想法的事情都将受到赞赏。有用的东西的链接也是如此。我自己研究过字符串,数组和指针(我在高中的时候就是自学),但这些概念仍然令人困惑。

附带问题,C中的字符串是自动存储为数组还是可以这样做?

3 个答案:

答案 0 :(得分:4)

要详细说明WhozCraig的答案,你所遇到的麻烦与字符串无关,而是与个别字符有关。

C中的字符串以字符数组的形式存储(并注意到末尾存在空终止符)。

字符本身在一个名为ascii的系统中编码,该系统为英语中使用的字符(仅限)分配0到127之间的代码。因此,“7”不存储为7,而是存储为7的ascii编码为55.

我想现在你可以看到为什么你的产品变得如此之大。

一种优雅的解决方法是转换

int num = (int) str[n];

int num = str[n] - '0';  
//thanks for fixing, ' '  is used for characters, " " is used for strings

此解决方案从字符的ascii代码中减去ascii代码为0,比如说“7”。由于数字是线性编码的,因此可以使用(对于单位数字)。对于较大的数字,您应该使用stdlib.h

中的atoistrtol

答案 1 :(得分:3)

字符串只是具有空终止字节的字符数组。 c中没有单独的字符串数据类型。

使用char作为整数时,使用数字ascii值。例如,说printf("%d\n", (int)'a');之类的内容会导致打印97(ascii值为'a')。

除非将数字转换为整数数组,否则不能使用数字字符串进行数值计算。要将数字转换为字符整数形式,您可以执行以下操作:

 char a = '2';
 int a_num = a - '0';
 //a_num now stores integer 2

这会导致ascii值'0'(48)从ascii值'2'(50)中减去,最后离开2.

答案 2 :(得分:2)

char str[21] = "73167176531330624919"

此代码相当于

char str[21] = {'7','3','1','6','7','1','7','6','5',/
                '3','1','3','3','0','6','2','4','9','1','9'}

所以存储在str [21]中的不是数字,而是char(它们的ASCII等效表示不同)。

侧面问题答案 - 是/否,字符串自动存储为char数组,但字符串确实有一个额外的字符(' \ 0')作为最后一个元素(其中char数组不需要有这样一个。)