我正在努力学习C++14 (以“现代”/非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;。
如何纠正这个程序?
发布于 2017-12-05 10:42:43
除了企鹅先生的回答,这对阿托伊来说是对的,你可以避免整个阿托伊仓促
sum_t sum_digits(std::string digits) {
sum_t total = 0;
for (const auto &digit : digits)
total += digit - '0'
return total;
}但是它对非数字字符的保护并不完全相同。
发布于 2017-12-05 10:35:09
atoi将参数作为以空结尾的字符串。
所以你应该做一些如下的事情:
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;
}附注:
没有new的delete会导致内存泄漏(atoi(new char(digit)))。
发布于 2017-12-06 16:30:36
一些附加注释:函数atoi() 是C样式函数,它需要一个以0结尾的C样式字符串(参见其他注释)。头stdlib.h也是一个C头.如果你写C++代码,你应该用#include <cstdlib>代替.您也可以使用在std::stoi()中定义的#include <string>,但是它的性能不好,因为它必须从字符构造一个字符串对象。
https://stackoverflow.com/questions/47651205
复制相似问题