gpt4 book ai didi

c++ - C++中的局部变量问题

转载 作者:行者123 更新时间:2023-11-30 00:39:33 26 4
gpt4 key购买 nike

我刚开始学习 c++ 的基础知识,我有 vb.net 和 c# 的经验

现在我认为了解一些 Project euler 问题的基础知识将是一个很好的练习。我通过尝试解决 Problem 4 遇到了一个非常奇怪的问题,可能是因为对 c++ 还缺乏了解。

我有 2 种情况,一种有效,一种无效(> 当执行 sprintf 命令时,a 变量只是从 999 跳到 768,如下所示),现在我的问题是:为什么在解决方案 1 中会发生这种情况?唯一的区别是循环变量 a 和 b 在循环之前声明,因为在解决方案 2 中它们是在循环中声明的。

解决方案 1(无效):

int a =999;
int b =999;
int lb = 100;
int c = 0;
char strNumber[6];
int result = 0;
int ra = 0;
int rb = 0;
for (a=999; a>=100; a--){
for (b = a; b>=lb; b--){
c = a * b;
sprintf(strNumber, "%d", c);
if (isPalindrome(strNumber)){
if (c > result){
result = c;
lb = b;
rb = b;
ra = a;
}
b = 0;
}
}
}

解决方案 2(有效):

int lb = 100;
int c = 0;
char strNumber[6];
int result = 0;
int ra = 0;
int rb = 0;

for (int a=999; a>=100; a--){
for (int b = a; b>=lb; b--){
c = a * b;
sprintf(strNumber, "%d", c);
if (isPalindrome(strNumber)){
if (c > result){
result = c;
lb = b;
rb = b;
ra = a;
}
b = 0;
}
}
}

最佳答案

其实两者都有同样的问题,即undefined behavior。问题源于这里:

char strNumber[6];

此变量不能在字符串表示中容纳 999 x 999 的值,因为还有一个空字符 '\0' 在结束。因此,当您调用 sprintf 将整数转换为其字符串表示形式时,就在函数内部,当它尝试将字符 '\0' 放在索引处时,它会调用未定义的行为6,因为索引05已经被998001的六位占用,998001999 x 999

您应该至少将其定义为 7:

char strNumber[7]; //one char for null-character.

至于为什么你的第二个代码可以工作是因为你很幸运(而不是不幸)。这就是未定义行为的含义:任何事情都可能发生。它可能运行,也可能不运行。语言规范和编译器均未对该行为提供任何保证,因此未定义行为。

正如@James Kanze 在评论中指出的那样,真正的解决方案是忘记 sprintf,而更好地使用 std::ostringstreamstd::字符串为:

#include <sstream> //for std::ostringstream 
#include <string> //for std::string

std::ostringstream ss;
ss << number;
std::string s = ss.str(); //get the string representation of the number

关于c++ - C++中的局部变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8618245/

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