在字符串中加整数值

时间:2019-03-22 00:09:38

标签: c++ string c-strings

我在解决我的一项家庭作业问题时遇到困难。

“编写一个程序,要求用户输入一系列的单数位数字,没有任何分隔。将输入读取为c字符串或字符串对象。该程序应在输入法中显示所有的单数位数字。例如,如果用户输入2514,则程序应显示12,即(2 + 5 + 1 + 4)。程序还应显示字符串中的最高位数和最低位数。“

我遇到的问题是弄清楚如何将字符串中的整数相加。我的代码在下面,感谢您的任何帮助,谢谢!

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

int main()
{
    //Declaring Variables & Character Array:
    int size;
    int sum;
    char integers[size];

    //Gathering Integers:
    cout << "Please enter a series of integers with nothing between them.";
    cin >> integers;

    //Gathering Size of String:
    size = strlen(integers) + 1;

    //Adding up Contents Within String:
    for(int i = 0; i < size; i++)
    {
        if(integers[i] > 0 && integers[i] < 9 && integers != "\0")
        {
           sum = integers[i]++;
        }
    }

    //Outputting Sum:
    cout << sum;

    return 0;
}

3 个答案:

答案 0 :(得分:2)

因此,您的方法存在一些问题,请考虑以下提示:

  1. 不读入char数组,而是从cin读入std::string
  2. 当您迭代遍历for循环中字符串的字符时,它们不是数字,而是ASCII字符。您需要弄清楚如何将'0'转换为0(提示,ascii字符也具有数字值,也许对此进行调查。)
  3. sum = integers[i]++;并不是您求和编号的方法。

答案 1 :(得分:1)

您可以使用以下内容:

std::string integers;

//Gathering Integers:
cout << "Please enter a series of integers with nothing between them.";
cin >> integers;
int sum = 0;

for (char c : integers)
    if (c >= '0' && c <= '9')
        sum += c - '0';

为解释以上代码的作用,我相信前两行很明显,我将跳至for()循环。这是C ++中使用的foreach循环形式。它从字符串中逐字符抓取并将其存储在变量中(在本例中为c),在循环中,我们可以正常检查c是否为数字0到9的ASCII表示形式。表示形式将转换为integerc - '0')。

您的方法是将整数与ASCII字符进行比较,您可以尝试以下操作:

if(integers[i] >= '0' && integers[i] =< '9' && integers != '\0') {
    sum = integers[i] - `0`;
}

您还有一个问题:

integers != "\0"

应为:

integers[i] != '\0'

“”是字符串的表示形式,即使您有"",它也是一个空字符串,但其中包含\0。在上述情况下,“ \ 0”包含“ \ 0 \ 0”。因此,基本上,您想要的是将单个字符与\0进行比较,而将字符串与\0\0进行比较。

还有另一个错误:

int size;
...
char integers[size];
...
cin >> integers; // SEGFAULT HERE
size = strlen(integers); 

未初始化的变量在C ++中是未定义的行为,并且可能包含从0MAX_INT的垃圾。如果segfaultsize,则可能会得到0,而您稍后尝试在0中输入超过integers个字符。您甚至会在到达size = strlen()之前进行段错误。

另一个未初始化的变量:

int size;

在修复了上述所有错误之后,我实际上从您的程序中获得了432552作为输出。

这是您的调试代码:

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

int main()
{
    //Declaring Variables & Character Array:
    int size = 100; // UNINITIALIZED VARIABLE
    int sum = 0;    // UNINITIALIZED VARIABLE
    char integers[size];

    //Gathering Integers:
    cout << "Please enter a series of integers with nothing between them.";
    cin >> integers;

    //Gathering Size of String:
    size = strlen(integers); // +1 ??? why

    //Adding up Contents Within String:
    for(int i = 0; i < size; i++)
    {
        // integers[i] >= 0 is comparing char to int
        // integers[i] <= 9 is comparing char to int
        // ingegers == "\0" is comparing entire string with stirng which contains "\0":s
        // < and > shoudl be <= nad >= to include 0 and 9                                                                                                                                                                                
        if(integers[i] >= '0' && integers[i] <= '9' && integers[i] != '\0')
        {
           // sum = integers[i]++; is incrementing character at integer[i]` not `sum`
           sum += integers[i] - '0';
        }
    }

    //Outputting Sum:
    cout << sum;

    return 0;
}

哈哈刚刚意识到您遇到的另一个错误:strlen()返回整数长度,假设string s="ABCD"被赋予strlen(s)将返回4,然后在for()循环中循环从0,最多4个,但自s[0] = 'A's[1] = 'B's[2] = 'c's[3] = 'D'起不包含4。

好吧,为了进一步解释,字符也具有数字值: enter image description here

如果您看到所有字符都有十进制值:这是上面的ascii表中的字符0 - 9的简短表:

 Character | Decimal Value
 ----------+--------------
   0       |    48
   1       |    49
   2       |    50
   3       |    51
   4       |    52
   5       |    53
   6       |    54
   7       |    55
   8       |    56
   9       |    57

所以要这样做:

 integers[i] - '0'

基本上就像是说

 integers[i] - 48

如果integer[i]8,它将保留56的十进制值。因此56 - 48将给出8

的整数值

答案 2 :(得分:1)

利用上面你们的帮助,我对其进行了编辑,以便现在可以这样工作:

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

int main()
{
    //Declaring Variables & Character Array:
    int size;
    char integers[size];
    int sum;

    //Small and Large Numbers:
    int small = 9;
    int large = 0;

    //Gathering Integers:
    cout << "Please enter a series of integers with nothing between them.";
    cin >> integers;

    //Gathering Size of String:
    size = strlen(integers) + 1;

    for(int i = 0; i < size; i++)
    {
        if(integers[i] >= '0' && integers[i] <= '9' && integers[i] != '\0')
        { 
            if(integers[i] == '0')
                sum += 0;
            if(integers[i] == '1')
                sum += 1;
            if(integers[i] == '2')
                sum += 2;
            if(integers[i] == '3')
                sum += 3;
            if(integers[i] == '4')
                sum += 4;
            if(integers[i] == '5')
                sum += 5;
            if(integers[i] == '6')
                sum += 6;
            if(integers[i] == '7')
                sum += 7;
            if(integers[i] == '8')
                sum += 8;
            if(integers[i] == '9')
                sum += 9;
        }
    }

    cout << sum << endl;


    return 0;
}