如何将字符数组中的每个字符转换为整数?

时间:2016-07-08 06:20:28

标签: c initialization literals

我已尝试过标准方法,但我的答案仍然存在错误。

我的代码:

int main() {   
   int val;
   char str[] = {'1', '45', '0'};

   val = str[1] - '0';

   printf("Int value = %d\n", val);

   return(0);
}

我的回答为5,而不是45

如何解决此问题?

[从comment更新:]

我实际上需要处理一个字符串数组。假设我想将八进制数转换为十进制数,而我的输入必须是一个字符串数组的形式。我希望将这些no.s转换为十进制:{45,17,100}为此,我首先需要提取每个元素并将其更改为整数。你能说一下最好的方法吗?

3 个答案:

答案 0 :(得分:1)

  

我实际上需要处理一个字符串数组

您在此处定义的内容

  char str[] = {'1', '45', '0'};

不是字符串数组,而是具有3个元素的{em>一个数组char。它甚至不是C - "字符串",因为这需要尾随值0。请注意,字符'0'的值不是0,但是,例如,对于ASCII字符集,它是48

'45'是一个多字节字符文字,实际上是一个整数。上面的代码尝试使用这个非常文字来初始化char - 数组strstr[1]的第2个元素,这是char)。

这不起作用。

char无法(必然)保留此字节字符文字的int值。在这种情况下,str[1]的初始化溢出,导致5的意外值。

要查看此问题,请尝试以下代码:

#include <limits.h>
#include <stdio.h>


int main(void)
{
  char c_min = CHAR_MIN;
  char c_max = CHAR_MAX;
  unsigned char uc = '45';

  printf("'1'=%d\n", '1');
  printf("'45'=%d\n", '45');
  printf("'0'=%d\n", '0');

  printf("lowest possible value for char=%d\n", c_min);
  printf("highest possible value for char=%d\n", c_max);

  printf("'45' converted to an (unsigned) char=%u\n", uc);

  return 0;
}

上面的示例显示了45在分配给char时如何截断{/ 1}}。

根据C实现,您使用'45'char的转换甚至可能会调用臭名昭着的未定义行为。这不好。

你似乎想要的是:

  #define ARRAY_SIZE_MAX 3

  char * str[ARRAY_SIZE_MAX] = {"1", "45", "0"}; /*. Mind the double quotes. */

这定义了一个指向char的3个指针的数组,每个指针指向一个C - &#34;字符串&#34;。

答案 1 :(得分:1)

这里,你得到5而不是45因为st [1] ='5',这是因为我们只有0到9个整数的ASCII值,45没有ASCII值。 要在字符串中存储45,您必须声明多维字符串。 例如:

char st[3][3]={'1', '45', '0'};

以下是工作代码:

#include<stdio.h>
int main(){
    int i,ans,j;
    char st[3][3]={{'1'}, {'4','5'},{'0'}};
    for(j=0;j<3;j++){
        for(i=0;st[j][i]>=48 && st[j][i]<=57;i++){
            ans=st[j][i]-'0';
            printf("%d",ans);
        }
        printf("\n");
     }
     return 0;
}

输出

1
45  
0

答案 2 :(得分:-1)

这取决于你想要什么。

  

每个角色都有自己的int值 - 它只是ASCII码

如果你将遍历整数并使其像%c一样打印,你将得到ASCII表(你可以看到它。there

但是如果你想从string / char数据类型读取int值,你必须解析它 - atoi (ascii到整数)函数 - 示例there

顺便说一下我不知道你的例子究竟是如何运作的,但问题是你在做什么:int val = '45' - '0'; int值'0'应该是48,'45'我不知道,但'4'是52int并且'5'是53 int,所以类似的东西......

正如我写的那样你应该做int val = atoi('45') - atoi('0')之类的事情,但肯定可能更好地按照以下方式投射到int int val = (int) (atoi('45') - atoi('0')) - 在你的例子中完全是asi

int main() {   
   int val;
   char str[] = {'1', '45', '0'};

   val = (int) (atoi(str[1]) - atoi('0'));

   printf("Int value = %d\n", val);

   return(0);
}

不确定,但我认为这应该有效,希望能有所帮助