【问题标题】:C Converting Char array (strings) into int arrayC将Char数组(字符串)转换为int数组
【发布时间】:2016-08-13 23:58:32
【问题描述】:

我已经为此搜索了几个小时,但似乎找不到答案,尤其是在涉及 C 语言时。在 java 中,铸造之类的事情很简单,但我似乎无法在 C 中牢牢掌握它。

我的问题是:我必须从用户那里获得输入,他们可以输入从 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] 中,然后不填写其余部分。是否有某种功能可以让这一切变得简单快捷?

提前谢谢你。

【问题讨论】:

  • 如果归根结底,我可以遍历字符串数组的每个索引并检查数字和空格并以这种方式进行转换,但我想知道是否有更简单快捷的方法就像我可以使用的某种功能。
  • 您通常会使用类似 strtok 的函数来遍历字符串并按顺序获取每个数字

标签: c arrays type-conversion


【解决方案1】:

你可能想多了。这是一种从用户输入数字的简单方法,不涉及格式化或解析字符串。

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 之间!

【讨论】:

  • 确实,这似乎是我想多了。我绝对可以使用这段代码。非常感谢。完成编码后,我会尽快回复你们
  • 太棒了!不要忘记,一旦用户输入完他们的号码,他们可能还没有填满数组。因此,当您读取或打印出他们给出的数字时,一旦您从中读取/打印了 i 元素,就需要停止从数组中读取/打印。
  • 如果我输入一个负数作为输入,循环不会停止。负数仍然存储在数组中。不过,我在我的程序上取得了相当不错的进展
  • 是的,这不会在否定输入时退出..建议从您的答案中删除它或修改代码以实现它。否则 +1。
  • 我非常喜欢……真的,当我张开嘴以为我知道一些事情时,我学到的最多,而事实证明我实际上并不知道。 scanf 例如,我认为除了 comp sci 101 之外没有多少人使用过它,我肯定还没有。在马歇尔·马瑟斯出现之前,我认为你的回答很好,我不太确定他在说什么,我得在谷歌上搜索一下才能弄清楚。
【解决方案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() 语句之类的东西应该很容易。

编辑: 如果您正在寻找库函数,请查看以下问题:

What is the difference between sscanf or atoi to convert a string to an integer?

【讨论】:

  • 知道了,在您回复我解释与您发布的相同内容后几秒钟,我刚刚在我的帖子上写了一条评论。我目前正在使用具有 sscanf 等功能的 stdio.h 库,我只是不知道它是否可以用来轻松地将字符串转换为 int,或者设置一个遍历数组的每个元素并将其转换的循环.
  • 知道了,谢谢!指向其他帖子的链接对未来非常有帮助和信息。
  • @MazzY 没问题,很乐意提供帮助。如果对您有帮助,我们将不胜感激。
  • 我试图为你的答案和@Matthew Cliat 的答案投票,但我收到以下消息:“感谢您的反馈!一旦您总共获得 15 个声望,您的投票将改变公开显示的帖子分数。”一旦我获得足够的代表,我会确保回来并投票=)。
【解决方案3】:

我已经有一段时间没有使用“C”了,但这是基本的想法。要将 char 数组值转换为整数,您基本上必须将每个值分配给一个 int var,例如:

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

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

【讨论】:

  • 这完全是错误的——C 将字符表示为内存中的整数是对的,但它使用 ascii 表来表示。 “1”的 ascii 与数字 1 的二进制表示不同。这种转换不起作用。
  • 我明白了,感谢您对类型转换的见解。 =)。如果 c[1] 恰好是空格,int 数组将如何处理空格?在我之前的项目中,我使用 30H(十六进制)作为 ASCII 中“0”的引用。为了使用 chars 获取数字,我会执行 c-'0' 之类的操作。
  • 好吧,如果 c[1] = 0x30;例如,下面的 int i = c[1],....i 现在等于 0x30。额外的字节只会用零填充。一些编译器实际上以相反的顺序存储字节,但这在这个例子中并不重要。顺便说一句,这还取决于您使用的是有符号字符还是无符号字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2014-03-02
  • 2023-03-18
  • 2012-03-26
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多