首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atoi的Sum输出

atoi的Sum输出
EN

Stack Overflow用户
提问于 2017-12-05 10:21:55
回答 3查看 377关注 0票数 1

我正在努力学习C++14 (以“现代”/非C风格)。我试图将字符串中的数字与下一个数字(或第一个数字,如果在字符串的末尾)相加。我用Python解决了这个问题,但是在C++14中,我得到了意想不到的输出。

main.cpp

代码语言:javascript
复制
#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;
}

输出的最后两行是:

代码语言:javascript
复制
sum this far: 18446744073627459815
NO

但我期待着:

代码语言:javascript
复制
sum this far: 1144                                                                                
YES

我用以下方法编写了程序:

代码语言:javascript
复制
g++ -O2 -std=c++14 -Wfatal-errors -pedantic -Wall main.cpp -o main

我还试过using sum_t = int;using sum_t = uint64_t;

如何纠正这个程序?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-05 10:42:43

除了企鹅先生的回答,这对阿托伊来说是对的,你可以避免整个阿托伊仓促

代码语言:javascript
复制
sum_t sum_digits(std::string digits) {
    sum_t total = 0;
    for (const auto &digit : digits)
        total += digit - '0'
    return total;
}

但是它对非数字字符的保护并不完全相同。

票数 4
EN

Stack Overflow用户

发布于 2017-12-05 10:35:09

atoi将参数作为以空结尾的字符串。

所以你应该做一些如下的事情:

代码语言:javascript
复制
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;
}

附注:

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

票数 3
EN

Stack Overflow用户

发布于 2017-12-06 16:30:36

一些附加注释:函数atoi() 是C样式函数,它需要一个以0结尾的C样式字符串(参见其他注释)。头stdlib.h也是一个C头.如果你写C++代码,你应该用#include <cstdlib>代替.您也可以使用在std::stoi()中定义的#include <string>,但是它的性能不好,因为它必须从字符构造一个字符串对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47651205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档