我还是新来的论坛,所以我提前为论坛礼仪问题道歉。
我无法理解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中的字符串是自动存储为数组还是可以这样做?
答案 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
答案 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数组不需要有这样一个。)