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

program that converts a char array into an integer array c++

本文关键字:数组 C++ 整数 程序 char 转换      更新时间:2023-10-16

所以我的学校作业如下:

编写一个程序,要求用户输入一系列个位数的数字,没有任何分隔。将输入作为 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,我收到一个错误,指出类型"char"的参数与"const char"类型的参数不兼容。

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

任何帮助将不胜感激!

要理解的最重要的解决方法是:

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()不是您想要的。相反,你应该使用我上面写的,取自这个答案。


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

所以,在阅读了这个和这个之后,我用这个替换了你的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 themn";
  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. for(int i=0;i<=100,i++;)应该for(int i=0;i<100;i++) <- 这可能会给出垃圾值。请参阅萨马拉斯的回答以获取更详细的解释

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

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

如果你知道要从标准输入中读取多少个数字,你可以做这样的事情:

#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);
}