将字符数组(字符串)转换为整型数组的C语言方法

5
我已经寻找了几个小时,但似乎找不到答案,特别是在C语言方面。 在Java中,这只是简单的转换等问题,但是我似乎无法掌握它。
我的问题是:我必须从用户那里获取输入,他们可以输入0到31之间的任何数字。 他们最多可以输入31个数字,并且可以重复。 输入可能是这样的:3 15 32。 我知道如何使用fgets()函数将此输入作为字符串存储。 将输入存储在数组s []中;
现在,我卡在这一部分上了,我该如何将其转换为int数组,以便int int [0] = 3,i [1] = 15,i [2] = 32等等。
我尝试使用sscanf(s,“%d”,int),但它只能获取输入中的第一个数字,将其存储在int [0]中,然后没有填充其他数字。 是否有某种函数可以使所有这些变得容易和快速?
提前致谢。

如果必要的话,我可以遍历字符串数组的每个索引,检查数字和空格并进行转换,但我想知道是否有更简单、更快速的方法,比如某种函数可以直接使用。 - MazzY
通常情况下,您会使用像strtok这样的函数来迭代字符串并按顺序获取每个数字。 - bruceg
3个回答

2
您可以使用库,也可以编写帮助函数。帮助函数可能如下所示(伪代码):
int output = 0;
for (int i = 0; i < string.length; i++) {
  output = output * 10;
  output = output + parse(string[i]) //parse first character into a single digit
}

例如,如果你有253,它会读取2。然后它将乘以10(20)并加上5(25)。接下来,它将乘以10(250)并加上3,这将是预期的输出。
请注意,您需要找到一种将字符串的单个字符解析为单个数字整数的方法 - 使用类似switch()语句应该非常容易。
编辑: 如果您正在寻找库函数,请查看此问题: sscanf或atoi将字符串转换为整数有什么区别?

我刚才在你回复后几秒钟就在我的帖子上写了一条评论,解释了与你发布的相同的事情。我目前正在使用stdio.h库,该库具有诸如sscanf等函数,我只是不知道它是否可以轻松地将字符串转换为整数,或设置一个循环来遍历数组的每个元素并进行转换。 - MazzY
明白了,谢谢!那篇其他帖子的链接对未来非常有帮助和信息丰富。 - MazzY
@MazzY 没问题,很乐意帮助。如果对你有帮助的话,希望能得到一个赞。 - nhouser9
我试图给你和@Matthew Cliat的回答点赞,但是我收到了这个消息:“感谢您的反馈!一旦您获得总计15个声望,您的投票将改变公开显示的帖子分数。”一旦我获得足够的声望,我会回来点赞的 =)。 - MazzY

2

您可能在想得太多。下面是一种简单的方法,可以从用户输入数字,而不涉及格式化或解析字符串。

int numArray[31];
int i = 0;
int num = 0;

while( scanf("%d", &num) > 0 && i < 31 && num >0) {
    numArray[i] = num;
    i++;
}

循环将在用户输入负数或输入了所有31个可能的数字时停止。
但仍需要确保用户输入的数字在0到31之间!

1
看起来我想太多了。我肯定可以用这段代码工作。非常感谢你们。等我编码完成后,我会尽快回复你们的。 - MazzY
太好了!不要忘记,一旦用户输入完数字,他们可能没有填满数组。因此,当您读取或打印他们提供的数字时,您需要在从数组中读取/打印了 i 个元素后停止读取/打印。 - Matt C
2
是的,这在负输入上不存在..建议从你的答案中删除它或修改代码使其发生。否则+1。 - yano
@yano MazzY很慷慨地添加了代码。我很高兴看到我们的用户是如此积极主动 :) 无论是您的建议,还是MazzY作为一个新用户不仅提出问题,而且在问题解决后还回应答案。 - Matt C
1
我喜欢 Stack Overflow.. 当我自以为知道某些东西时,开口说出来后发现其实并不懂,这时我学到的最多。比如说 scanf,我想很少有人在计算机科学101之外使用过它,至少我没有。我认为你的回答很好,直到 Marshall Mathers 出现,我不太确定他的意思,我得上网搜索一下才能弄清楚。 - yano
显示剩余6条评论

-1

我已经有一段时间没有使用'C'了,但是这里是基本思路。要将char数组值转换为整数,您基本上必须将每个值分配给int变量,例如:

i[0] = c[0]
i[1] = c[1]
i[2] = c[2]

你不能直接将数字转换为整数引用的原因是C语言分配了一个连续的内存空间来保存这3个字符。根据你使用的编译器,char大小和int大小会有所不同。但如果每个char都是8位,那么3个char的数组就是3个字节。16位int将等于6个字节。如果你直接将它们转换为int,你将得不到正确的值,因为内存地址会重叠。

这是完全错误的 - 你说得对,C语言在内存中将字符表示为整数,但是它使用的是ASCII表。数字"1"的ASCII码不同于数字1的二进制表示。这种转换是行不通的。 - nhouser9
我明白了,感谢您对类型转换的见解。如果c [1]恰好是空格,int数组将如何处理空格?在我的以前的项目中,我使用30H(十六进制)作为ASCII中的“0”的参考。为了使用字符获取数字,我会做类似于c-'0'的操作。 - MazzY
如果c[1] = 0x30,那么接下来的int i = c[1],...i现在等于0x30。多余的字节将只用零填充。一些编译器实际上是以相反的顺序存储字节,但在这个例子中并不重要。顺便说一句,这也取决于您是否使用有符号字符或无符号字符。 - KitakamiKyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接