gpt4 book ai didi

c++ - cout 的存在改变了程序的结果

转载 作者:太空狗 更新时间:2023-10-29 23:46:48 26 4
gpt4 key购买 nike

我正在编写一个程序,对文本文件中的 100 位 50 位数字的前十位求和。很简单,我得到了正确的答案,但我试图理解一些似乎正在发生的奇怪事情。当包含第一行 cout 时,它显示在程序输出下方:

8549904804355727945614717320-7-60-4-3-2-7-3-4-8-7-7-6-1-840-9-5-2-3-39622981389563771795892386478402037366780930326737553

当改成右边的注释时,输出:

97414719961102146325906539660-4-7-2-4-4-3-4-8-2-8-3-8-2-870-8-5-2-3-39622981389563771795892386478402037366780930326737553

我听不懂
1) 我输出的内容如何以某种方式影响它输出的 future 值。
2)破折号如何进入程序。

注意:输出的是所有字符串的逆序之和。

char file[] = "nums.txt";
ifstream ss(file);
string iString;
string sarr[100];
int sum[100];

while(getline(ss, iString, '\n')) {
sarr[i] = iString;
i++;
}
ss.close();

cout << sarr[0] << endl << endl; //or cout<<(int)sarr[0][3]-48<<endl<<endl;
for(int i = 99; i >= 0; i--) {
sum[i] = 0;
for(int j = 0; j < 100; j++) {
sum[i] += (int)sarr[j][i];
}
sum[i] -= 4800;//since 100 strings and '0' in ascii is 48 subtract 48*100
}

for(int i = 99; i > 0; i--) {
sum[i-1] += sum[i] / 10;
sum[i] = sum[i] % 10;
cout << sum[i];
}
cout << sum[0] << endl << endl;

最佳答案

你说你的文本文件的第一行是37107287533902102798797998220837590246510135740250,它有50个字符长,但是这里

for(int i = 99; i >= 0; i--) {
sum[i] = 0;
for(int j = 0; j < 100; j++) {
sum[i] += (int)sarr[j][i];
}
sum[i] -= 4800;//since 100 strings and '0' in ascii is 48 subtract 48*100
}

您正在循环使用 i 从 99 到 0 并使用 i 索引该字符串。您的索引超出范围并导致未定义的行为。这就是使用硬编码值而不是使用数据来确定循环边界的危险。

当这样的随机事件发生并且您正在对数组进行大量操作时,您应该寻找的第一件事就是某处的索引越界。这可能是 UB 最常见的原因。

关于c++ - cout 的存在改变了程序的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8830816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com