来自ATOI的总和输出

Sum outputs from atoi

本文关键字:输出 ATOI 来自      更新时间:2023-10-16

我正在尝试学习C 14(具有"现代"/non-c样式)。我正在尝试将数字汇总在字符串中,对于等于下一个数字的数字(或第一个数字,如果在字符串的末尾)。我在Python中解决了它,但是在C 14中,我获得了意外的输出。

main.cpp

#include <iostream>
#include <stdlib.h>
using namespace std;
using sum_t =  uint64_t; // int; // unsigned long long;
// sum_digits sums the digits in the given std::string and returns an integer of type sum_t
sum_t sum_digits(std::string digits) {
    sum_t total = 0;
    for (const auto &digit : digits) {
        total += atoi(new char(digit));
        cout << "sum this far: " << total << endl;
    }
    return total;
}
// return the last char
// returns ' ' if given an empty string
char last(std::string digits) {
    auto dl = digits.length();
    if (dl < 1) {
        return ' ';
    }
    return digits.at(dl - 1);
}
// sum_equal_digits returns a sum of the digits that are equal to the next one
sum_t sum_equal_digits(std::string digits) {
    auto equal_digits = ""s; // a list of equal digits, as std::string
    auto prev_digit = last(digits); // start with the last digit, since the digit list is supposed to be circular
    for (const auto &digit : digits) {
        if (digit == prev_digit) {
            equal_digits += digit;
        }
        prev_digit = digit;
    }
    return sum_digits(equal_digits);
}
void equal(sum_t a, sum_t b) {
    if (a == b) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
        exit(EXIT_FAILURE);
    }
}
int main() {
    equal(sum_equal_digits("1122"s), 3);
    equal(sum_equal_digits("1111"s), 4);
    equal(sum_equal_digits("1234"s), 0);
    equal(sum_equal_digits("91212129"s), 9);
    equal(sum_equal_digits("823936645345581272695677318513459491834641129844393742672553544439126314399846773234845535593355348931499496184839582118817689171948635864427852215325421433717458975771369522138766248225963242168658975326354785415252974294317138511141826226866364555761117178764543435899886711426319675443679829181257496966219435831621565519667989898725836639626681645821714861443141893427672384716732765884844772433374798185955741311116365899659833634237938878181367317218635539667357364295754744829595842962773524584225427969467467611641591834876769829719248136613147351298534885563144114336211961674392912181735773851634298227454157885241769156811787611897349965331474217223461176896643242975397227859696554492996937235423272549348349528559432214521551656971136859972232854126262349381254424597348874447736545722261957871275935756764184378994167427983811716675476257858556464755677478725146588747147857375293675711575747132471727933773512571368467386151966568598964631331428869762151853634362356935751298121849281442128796517663482391226174256395515166361514442624944181255952124524815268864131969151433888721213595267927325759562132732586252438456569556992685896517565257787464673718221817783929691626876446423134331749327322367571432532857235214364221471769481667118117729326429556357572421333798517168997863151927281418238491791975399357393494751913155219862399959646993428921878798119215675548847845477994836744929918954159722827194721564121532315459611433157384994543332773796862165243183378464731546787498174844781781139571984272235872866886275879944921329959736315296733981313643956576956851762149275521949177991988236529475373595217665112434727744235789852852765675189342753695377219374791548554786671473733124951946779531847479755363363288448281622183736545494372344785112312749694167483996738384351293899149136857728545977442763489799693492319549773328626918874718387697878235744154491677922317518952687439655962477734559232755624943644966227973617788182213621899579391324399386146423427262874437992579573858589183571854577861459758534348533553925167947139351819511798829977371215856637215221838924612644785498936263849489519896548811254628976642391428413984281758771868781714266261781359762798"), 1144);
    return 0;
}

输出的最后两行是:

sum this far: 18446744073627459815
NO

,但我期望:

sum this far: 1144                                                                                
YES

我用:

编译了该程序
g++ -O2 -std=c++14 -Wfatal-errors -pedantic -Wall main.cpp -o main

我也尝试了using sum_t = int;using sum_t = uint64_t;

如何纠正程序?

在MR1PENGUIN的答案中加上适合ATOI的答案;一个人可以避免使用

的整个atoi hastle
sum_t sum_digits(std::string digits) {
    sum_t total = 0;
    for (const auto &digit : digits)
        total += digit - '0'
    return total;
}

,但它不会对非数字字符具有完全相同的保护。

atoi以null终止字符串为例。

因此,您应该做类似的事情:

sum_t sum_digits(std::string digits) {
    sum_t total = 0;
    char tmp[2] = { 0 };
    for (const auto &digit : digits) {
    tmp[0] = digit;
    total += atoi(tmp);
        cout << "sum this far: " << total << endl;
    }
    return total;
}

P.S。

newdelete导致内存泄漏(atoi(new char(digit)))。

一些附加的注释:函数atoi() is c-style函数,它需要0端的C风格字符串(请参阅其他注释)。头部stdlib.h也是C-Header。如果您编写C - 代码,则应使用#include <cstdlib>。您也可以使用#include <string>中定义的std::stoi(),但不能执行良好,因为它必须从字符中构造字符串对象。