来自ATOI的总和输出
Sum outputs from atoi
我正在尝试学习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 hastlesum_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。
new
无delete
导致内存泄漏(atoi(new char(digit))
)。
一些附加的注释:函数atoi()
is c-style函数,它需要0端的C风格字符串(请参阅其他注释)。头部stdlib.h
也是C-Header。如果您编写C - 代码,则应使用#include <cstdlib>
。您也可以使用#include <string>
中定义的std::stoi()
,但不能执行良好,因为它必须从字符中构造字符串对象。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 来自ATOI的总和输出
- C:atoi()对未符号字符的输出输出