5

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

我无法理解int数组和char数组之间的区别。

我最近写了一个欧拉计划问题的程序,最初使用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 中的字符串是自动存储为数组还是可以这样做?

4

3 回答 3

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 代码中减去 0 的 ascii 代码,例如“7”。由于数字是线性编码的,因此这将起作用(对于单个数字)。对于较大的数字,您应该使用atoistrtol fromstdlib.h

于 2013-08-13T05:01:54.743 回答
3

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

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

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

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

这会导致从 ascii 值 '2' (50) 中减去 '0' (48) 的 ascii 值,最后留下 2。

于 2013-08-13T05:03:46.127 回答
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] 中的不是数字,而是字符(它们的 ASCII 等效表示不同)。

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

于 2013-08-13T05:33:12.703 回答