【问题标题】:program that converts a char array into an integer array c++将char数组转换为整数数组c ++的程序
【发布时间】:2015-01-27 13:55:56
【问题描述】:

所以我的学校作业如下:

编写一个程序,要求用户输入一系列单个数字,没有任何分隔。将输入读取为 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;

任何帮助将不胜感激!

【问题讨论】:

  • 为什么atoi()要被**括起来?
  • 啊,我的程序中没有这些,一定是我发布问题时犯的错误。
  • 为什么是全局变量?为什么在 C++ 代码中使用 C 字符串?

标签: c++


【解决方案1】:

要理解的最重要的修复是:

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 结束。因此,您应该使用 &lt; 而不是 &lt;=。 另外,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 的答案,该答案在编辑后可能无效,但提出了使用向量解决您的问题的想法。

【讨论】:

  • 好的,非常感谢您输入所有这些内容!是的,我目前正在上我的第一门计算机科学课程,之前没有编程经验,所以我还不知道如何将变量传递给函数。就像你说的,我的 cin 声明是问题所在。在了解了您对 cin.peek() 所做的事情之后,我重写了我的内容,使其与您编写的内容更加相似(我不想只是懒惰并复制并粘贴您的整个程序)。一切正常 100%!
  • Bravo @skulltula,这是朝着学习过程迈出的非常好的一步。毕竟所有的打字都是值得的! (这就是我赞成你的问题的原因)。
【解决方案2】:
  1. for(int i=0;i&lt;=100,i++;) 应该是 for(int i=0;i&lt;100;i++)

  2. atoi 接受一个指针,你传递的是一个数字。

【讨论】:

  • 直到100 仍然是错误的。看看我的回答。
  • 不错的诺埃尔。虽然在第 2 点很好,编辑也很好,因此这是我的 +1。
【解决方案3】:

编辑:由于问题已更新,这显然无效。

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

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

【讨论】:

  • 你可以先问再回答,而不是做出假设。 :) 此外,您可能需要考虑用户的级别。我不认为他知道向量。 :p 另外,如果你不知道如何检查读取的位数,你可以看看我的回答。
  • 是的。以后我会记得这样做的。
  • 好。现在关于您的程序,我将更改函数内的 for 循环以使用无符号整数作为 i,以便编译器不发出警告。我将main() 中的 100 更改为 3,输入了数字,但没有任何反应,因为按照您的方式,用户应该输入一个数字,然后按 Enter 等等,这不是问题所提到的。 (我现在看到你说答案无效的更新)。
  • 好吧,当我回答这个问题时(过早地),这不是问题的一部分。我的回答可能有点半心半意。自从我在手机上编写代码以来,我还没有编译过代码。我只是想说明一个想法。我赞成你的回答,我认为它应该被 op 接受。
  • 是的,我看到了编辑。谢谢。很好,你指出了向量,因为这是 C++。如果您的答案仍然有效,我也会投票。
猜你喜欢
  • 2017-10-08
  • 2016-02-27
  • 2011-08-28
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多