如何在C编程中将字符数组转换为整数数组?

3
#include<stdio.h>

#include<stdlib.h>

#define LENGTH 5 

void convert ( char parray[] ,int array[] )

{

    int i; 
    for (i=0; i< LENGTH; i++)
    {
        array[i] = atoi(&parray[i]);
        printf(" The converted array is %d\n" , array[i]);
    }
}

int main ()

{

    char parray[LENGTH] = { '7', '1', '4','5' ,'2'};

    int iarray[LENGTH];

    convert(parray, iarray);
}

******** 输出 *********

The converted array is 71452

The converted array is 1452

The converted array is 452

The converted array is 52

The converted array is 2

But I want the following output like this

The converted array is 7

The converted array is 1

The converted array is 4

The converted array is 5

The converted array is 2

请帮忙,需要将值7存储在array[0]中,将值1存储在array[1]中!!!


2
我尝试了,但出现了错误。LSerni先生:error: passing argument 1 of ‘atoi’ makes pointer from integer without a cast [-Werror=int-conversion] array[i] = atoi(parray[i]); - Anas
1
  1. 字符串需要以空字符结尾。
  2. atoi将整个字符串转换为整数,而不是逐位转换。
- Lundin
抱歉,我没有仔细看。我以为它是一种不同类型的数组。MikeCAT已经给出了正确的答案。 - LSerni
感谢LSerni先生和Lundin先生抽出时间。 - Anas
3个回答

4

atoi()函数是将字符串(以空字符结尾的字符序列)转换为整数的函数。要将单个字符转换为整数,可以从该字符中减去'0'(即字符0的字符代码),因为在C规范中保证了十进制数字的字符代码是连续的。

void convert ( char parray[] ,int array[] )

{

    int i; 
    for (i=0; i< LENGTH; i++)
    {
        array[i] = parray[i] - '0';
        printf(" The converted array is %d\n" , array[i]);
    }
}

1
我认为60k用户应该先寻找重复项。 - 0___________
谢谢Mike先生抽出时间,当我测试时它完美地运行了。 - Anas
1
虽然我能理解你为什么选择了那个重复目标(我不会争辩),但请注意它并没有解决在这种情况下使用atoi函数的问题。 - Adrian Mole

2

这个声明

array[i] = atoi(&parray[i]);

调用未定义的行为,因为字符数组parray不包含一个字符串:以零字符'\0'结尾的一系列字符。而函数atoi期望其参数是一个字符串。

相反,您可以编写:

array[i] = parray[i] - '0';

数字字符'0''9'具有增加1的编码序列。例如,如果写入'3' - '0',将得到整数3


字符数组parray[LENGTH] = {'-7', '1', '4', '5', '2'}; 当我想把类似于-7这样的多个字符存储在数组中时,将其放到parray[0] = -7中时出现错误。错误信息为:multi-character character constant [-Werror=multichar]。 - Anas
@AnasMunir 这是一个多字节字符。它的表示取决于具体实现。 - Vlad from Moscow

2
你将单个字符和字符混淆了。后者是由字符(数组)序列组成的,以nul(零值)字符结尾,这就是atoi函数期望的输入。
要将单个字符数字转换为其数字值,只需从该字符的值中减去零数字('0')的值(数字数字的值是由标准保证连续的)。
所以,不是:
array[i] = atoi(&parray[i]);

使用:

array[i] = parray[i] - '0'; // Will work if (and only if) parray[i] is a digit.

您的代码中发生的情况是(偶然地),在您的5个字符数组结束后紧接着有一个零字节(但您不能依赖于此),因此每个 atoi(&parray[i]) 调用都会传递以分别从 '7''1''5''4''2' 字符开始的字符字符串,并且只在 '2' 之后结束。因此,您得到的值代表由单个数组数字组合而成的数字。但我要重申:您不能指望在数组后面有一个零值字符!


char parray [LENGTH] = {'-7','1','4','5','2'}; 当我像 -7 这样有多个字符时,并将其存储在数组 [0] = -7 中时!在 parray 中输入 -7 时会出现错误。错误:多字符字符常量 [-Werror=multichar]。 - Anas
@AnasMunir 我认为使用'-7'来初始化一个char变量会让你处于未定义的行为领域。在我的系统上,它表示一个值为11575int常量,但是如何将其解释为char可能会有所不同。 - Adrian Mole
基本上我是在问是否有一种方法可以转换多个字符,例如-7。我的程序只适用于单个字符,如1 4 9。但不适用于14或-7。是否有一种方法可以修改我的函数以便转换多个字符?Adrian先生 - Anas
1
@Anas - 在字符串字面量中使用双引号,在单个字符字面量中使用单引号。'2'是一个字符(实际上是一个int);"2"是由数字2和空终止符组成的字符串。 - Adrian Mole
让我们在聊天中继续这个讨论 - Anas
显示剩余2条评论

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