将char数组转换为整数数组c ++的程序

时间:2014-11-28 22:15:38

标签: c++

所以我的上学任务如下:

编写一个程序,要求用户输入一系列单个数字的数字,而不会将它们分开。将输入读取为C字符串对象。程序应显示字符串中所有单位数字的总和。例如,如果用户输入2518,程序应显示16,即2,5,1和8的总和。程序还应显示字符串中的最高位和最低位。

示例输出:

输入一系列数字,它们之间没有空格。

2518

这些数字的总和是16

最高位是8

最低位是1

这是我的代码:

#include<iostream>
#include <cstdlib>
#include<cstring>
using namespace std;

char input[100];
int x[100];

void user_input(char[]);
void char_int_conversion(char[],int[]);
void lowest_highest_digit(int[]);

int main()
{
    user_input(input);
    char_int_conversion(input,x);
    lowest_highest_digit(x);


    return 0;
}

void user_input(char input[])
{
    cout<<"Enter a series of digits with no spaces between them";
    cin>>input;
}

void char_int_conversion(char input[],int x[])
{
    for(int i=0;i<=100,i++;)
        x[i]=atoi(input[i]);
}

void lowest_highest_digit(int x[])
{
    int lowest=x[0];
    int highest=x[0];
    int total=0;

    for(int i=0;i<=100,i++;)
        if(x[i]<lowest)
            lowest=x[i];
    for(int i=0;i<=100,i++;)
        if(x[i]>highest)
            highest=x[i];

    for(int i=0;i<=100,i++;)
        total = total+x[i];

    cout<<"The sum of those digits is: "<<total<<endl
        <<"The highest digit is: "<<highest<<endl
        <<"The lowest digit is: "<<lowest<<endl;
}

在第31行,我使用atoi函数将char数组输入转换为整数数组x,我得到一个错误,说明类型&#34; char的参数与类型&#34; const char&#34的参数不兼容;。

如果我从atoi(input [i])删除[i]我可以得到程序来构建,但是所有的输出变量都等于0;

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

最重要的解决方法是:

for(int i=0;i<=100,i++;)
  x[i]=atoi(input[i]);

应该是这样的:

for (int i = 0; i < n; i++)
  x[i] = input[i] - '0';

你看,数组的索引从零开始,以size_of_array结尾 - 1.因此,你应该使用<而不是<=。 此外,for循环语法错误。

此外,您希望将每个数字转换为整数,因此atoi()不是您想要的。相反,你应该使用我上面写的,取自this回答。


一个基本问题是,无论用户键入多少位数,您都会读取整个数组,所有100个单元格。您应该只检查数组的第一个n单元格,其中n是用户键入的位数。

因此,在阅读thisthis后,我将cin替换为:

char c;
while ((cin.peek()!='\n') && cin >> c)
{
  input[n] =  c;
  n++;
}

您看,我使用n来跟踪用户键入的位数!

其他单元格,在n第一个未初始化之后,它们包含垃圾值!


把它们放在一起你有:

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

char input[100];
int x[100];
int n = 0;

void user_input(char[]);
void char_int_conversion(char[], int[]);
void lowest_highest_digit(int[]);

int main() {
  user_input(input);
  char_int_conversion(input, x);
  lowest_highest_digit(x);

  return 0;
}

void user_input(char input[]) {
  cout << "Enter a series of digits with no spaces between them\n";
  char c;
  while ((cin.peek()!='\n') && cin >> c)
  {
    input[n] =  c;
    n++;
  }
}

void char_int_conversion(char input[], int x[]) {
  //for (int i = 0; i <= 100, i++;)
  for (int i = 0; i < n; i++)
    x[i] = input[i] - '0';
}

void lowest_highest_digit(int x[]) {
  int lowest = x[0];
  int highest = x[0];
  int total = 0;

  for (int i = 0; i < n; i++)
    if (x[i] < lowest)
      lowest = x[i];
  for (int i = 0; i < n; i++)
    if (x[i] > highest)
      highest = x[i];

  for (int i = 0; i < n; i++)
    total = total + x[i];

  cout << "The sum of those digits is: " << total << endl
       << "The highest digit is: " << highest << endl << "The lowest digit is: "
       << lowest << endl;
}

我相信你还没有学会如何将变量传递给函数,这就是你使用全局变量的原因。如果不是这样,那么就摆脱全局变量。


此外,由于这是C ++,您可能希望使用std::vector。这样您就不必考虑阵列应该有多少单元格,或者跟踪手动给出的数字。请参阅warsac的答案,该答案在编辑后可能无效,但提出了使用向量解决问题的想法。

答案 1 :(得分:1)

  1. for(int i=0;i<=100,i++;)应为for(int i=0;i<100;i++)&lt; - 这可能会产生垃圾值。有关更详细的解释,请参阅Samaras的答案

  2. atoi拿了一个指针,你正在传递一个数字。

答案 2 :(得分:1)

编辑:自问题更新以来,这显然无效。

如果您知道要从标准输入中读取多少个数字,您可以执行以下操作:

#include <vector>
#include <iostream>

using namespace std;

void PrintLargeSmallAndSum(const vector<int>& v)
{
    if(v.empty())
        return;
    int min = v[0];
    int max = v[0];
    int sum = 0;
    for(int i = 0; i < v.size(); ++i)
    {
        sum += v[i];
        if(v[i] < min)
            min = v[i];
        if(v[i] > max)
            max = v[i];
    }
    cout<<"The sum of those digits is: "<<sum<<endl
        <<"The highest digit is: "<<max<<endl
        <<"The lowest digit is: "<<min<<endl;
}

int main()
{
    vector<int> v;
    for(int i = 0; i < 100; ++i)
    {
        int number;
        cin >> number;
        v.push_back(number);
    }
    PrintLargeSmallAndSum(v);
}