当我尝试找出字符串的长度时,Sizeof 是一个负数
Posted
技术标签:
【中文标题】当我尝试找出字符串的长度时,Sizeof 是一个负数【英文标题】:Sizeof is a negative number when I try to find out the length of a string 【发布时间】:2014-10-26 13:05:34 【问题描述】:在我的代码中,我一直在尝试在字符串数组中查找特定字符串的长度。但是,当我这样做时,无论我尝试用什么方法查找特定字符串的长度,总是返回 -858993460
我一直在使用的代码是
void drawChoices(int x, std::string s [], int iChoice)
setCurPos(x, 1); //this function just sets the console cursor
for (int i = 0; i <= iChoice; i++)
color(15, 4); //this function just sets the console color
std::cout << "[" << s[i] << "]";
color(8, 8);
int asfa = sizeof s[i]; //this is the one causing trouble
std::cout << " \n";
我尝试使用sizeof
、string::length
和strlen
在数组中查找字符串的长度,但结果相同。
【问题讨论】:
你是如何确定 asfa 有这个负值的? -1 提供的代码没有说明所声称的行为(负大小)。 当您使用 Visual C++ 时,-858993460 是一个神奇的数字。转换成十六进制,就是0xcccccccc。这是在 Debug 构建中初始化所有变量的值。每当你在调试时看到它,你就会去“啊,我正在使用一个未初始化的变量!”让调试器告诉你哪一个是问题,你的 for(;;) 循环中的一个错误是值得注意的。 -858993460 = 0xCCCCCCCC 这意味着you've accessed uninitialized memory 【参考方案1】:您永远无法使用sizeof
获得字符串的长度。 sizeof
运算符在编译时计算并返回类型或变量的大小。您对sizeof
的使用是:
sizeof s[i]
由于s[i]
具有std::string
类型,因此该表达式的计算结果为您的实现std::string
的大小。但这是在编译时确定的,因此不依赖于缓冲区的内容,您根本没有兴趣知道。
使用std::string::size()
or std::string::length()
获取std::string
的长度。
所以,在你的代码中你会使用
s[i].length()
获取字符串s[i]
中的长度,即字符元素的个数。另请注意,可互换的 size()
和 length()
方法返回您应该使用的 std::string::size_type
而不是 int
。
至于负值从何而来,我们不能说。您的代码不会输出 sizeof
产生的值,在任何情况下都不会是负数。
你的循环真的应该是
for (int i = 0; i <= iChoice; i++)
而不是
for (int i = 0; i < iChoice; i++)
与其传递并可能存储std::string
的数组,不如使用 C++ 容器更符合习惯。在这种情况下std::vector<std::string>
。
【讨论】:
@David Heffernan s[i] 具有 std::string 类型,其大小即使放在 int 类型的对象中也不能为负数。:) 感谢您的评论,但还是不行。正如我在帖子中所说,我已经尝试过std::string::length
。但是,我确实将int
与size_t
交换,但这产生了一个很大的正数。另外,对于您的其他建议,我发现这很有用,因此我不必每次使用参数调用函数时都减去一个。谢谢。
没有。众所周知,length
和 size
运行良好。 strlen
用于 C 字符串,sizeof
用于此应用程序是错误的。我无法评论您的未初始化值,因为我看不到您的代码。【参考方案2】:
从@VladfromMoscow 提到的内容来看,我已经找到了问题所在。
问题是当我使用 Visual Studio 2013 的调试和本地窗口时,我在变量初始化的同时进行调试。
随着本地窗口编译行的顺序以及 Visual Studio 的调试工作方式,它会给出一个随机数,因为变量没有被初始化。
它首先读取size_t asfa
,停止它,本地窗口获取该值,然后在我继续它时执行s[i].length();
。
我认为这将是程序的错误,因为我尝试输出 std::cout << asfa;
,但我记得你不能直接将 int
或 size_t
转换为字符串,而无需强制转换或转换。感谢所有帮助过的人。
【讨论】:
以上是关于当我尝试找出字符串的长度时,Sizeof 是一个负数的主要内容,如果未能解决你的问题,请参考以下文章