C字符串和atoi函数的问题

时间:2017-04-01 02:38:41

标签: c++ string c-strings atoi

我正在开发一个程序,要求用户输入C字符串,我的程序会将characters转换为ints,然后对它们求和。

然而,当我运行它时,我的程序将数字乘以其中的数字乘以 ie:如果我将123返回369或{ {1}}或123*3。它总结了整个C字符串,而不是像我试图获得它一样添加字符串的一个元素。

当我尝试123+123+123时,它会告诉我它无法将sum+=atoi(numbers[i]);转换为char,但是就像const char*它正在执行整串。

请为自己和他人解释如何正确地做到这一点。

sum+=atoi(numbers);

2 个答案:

答案 0 :(得分:0)

您正在致电

sum+=atoi(numbers);
三次。当然,您sum123+123+123

您需要做的是通过从角色中减去'0'将每个字符转换为数字。

for (int i=0; i < strlen(numbers); i++)
{
   char c = numbers[i];
   if ( isdigit(c) )
   {
      sum += (c - '0');
   }
   else
   {
      // Deal with the case when character is not a digit.
   }
}

答案 1 :(得分:0)

  

如果我把“atoi(数字[i]);”然后它告诉我我不能将char转换为const char *

这是事实。这是因为取消引用char指针会给你一个char。并且,由于atoi想要一个C风格的字符串,它应该是以\0(或该数组的第一个字符的地址)终止的字符数组。

所以你可以接受角色并从中制作一个字符串但是可能有更好的方法:

sum += numbers[i] - '0';

这将获取给定位置的实际角色并从中减去角色'0'。假设它是一个数字字符意味着你将得到等价的整数,一个介于09之间的数字,然后你可以将其加到总和中。

如果必须使用atoi,则方法如下:

  • 将角色复制到单独的字符串区域。
  • 追加终结者。
  • 使用atoi

执行此操作的循环类似于:

// Create buffer and terminate string.

char str[2];
str[1] = '\0';

// Loop over all characters.

for (int i = 0; i < strlen (numbers); i++) {
    // Make string from character, str[1] stays as '\0'.

    str[0] = numbers[i];

    // Use atoi on that string.

    sum += atoi (str);   
}