为什么strlen的()出现返回<空隙>在VC ++调试器? [关闭]
-
05-09-2019 - |
题
我在C ++字符串类型的const char*
作为参数传递的strlen,但它返回空隙。
它是这样
strlen(astruct.string);
谢谢..
编辑:做了一些检查,
strlen("test");
仍然给无效。为什么?
编辑:这里的图像 http://img14.imageshack.us/img14/1808/strlen.png
对不起不够明确先前。格式不工作得非常好。无论如何,混乱是由两个埃文特兰和弗拉德Romascanu解决。也看看布莱恩R.邦迪的答案。
感谢。随意关闭。
解决方案
参考屏幕截图:调试器是为<void>
显示strlen(...)
而实际上它应该显示一个错误
您不能调用方法并在调试手表上显示它们的结果。调试器将只显示现有的变量和数据。它不能调用按需任意方法,因为该方法可改变的方式被调试的程序,它没有被代码的任笔者也不由调试器预期的状态。
你可以做的是,在你的代码,临时添加:
size_t tmp_len = strlen(struc.string);
然后编译,并添加tmp_len到手表。
其他提示
正在由Visual Studio 6.0的蹩脚调试器混淆。不要依赖此。它可能无法返回值获得由于内联或类似的东西。
打印out的值以获得实际值。
编辑:另外,从你的榜样,看来你可能不反正存储strlen的结果。这也可能是为什么调试器中是不多见的返回值的原因。这是完全有可能的编译器决定,它并不需要,如果你不使用值实际执行strlen的。
注意:在这一点上存在对的仍然强>使用VC 6.0没有真正的理由。这是一个古老的编译器和IDE这是一个令人尴尬的差C ++编译器。在Visual C ++编译器的较新版本是免费的(不带IDE),使用它们。
strlen的是不返回void类型,这是你的调试器是不能做出正确的消息。
为什么你debbuger是显示无效?
所使用可能是围绕someothername_strlen strlen的一个的#define包裹的strlen的实现。
调试器可能不支持的#define正确或在功能上一些其它改性剂。
您将不得不这样做艾朗= strlen的(“测试”),然后检查艾朗在你的手表。
通常情况下,你可以在你的手表调用函数。例如尝试定义下面的函数然后调用它在你的手表:
int testFunc(char*)
{
return 5;
}
您可能会在你的手表,结果得到5。
strlen的返回一个整数,所以我想你的意思是返回 “0”。
此外,您指定的数据类型的方式,我也不太知道它是一个const char *或为const char **。如果是后者,那么你需要确保你提领该**到一个*。
我的猜测是,该字符串以空字节开始,这就是为什么它返回0。
在C ++中,函数始终返回它们被声明为返回的类型的值。由于strlen
函数的声明看起来是这样的:
size_t strlen(const char *);
它可以唯一可能返回的是一个size_t
。编译器使用在编译时该信息来确定如何当你调用该函数处理的返回值。这里的要点是,如果strlen
函数被声明为以上,所以不能决定返回void
有时和类型size_t
的值其他时间。
这一般是这样C ++静态类型语言的特性。在动态类型语言(Perl,Python和红宝石,PHP等)的功能可以决定每个被调用时返回任何类型的值。
它不能返回void。虚空是缺乏一个返回值的,所以你不能,错了,回吧。
您如何检查无效呢?虚空不是一个值。请展示你是如何越来越无效。难道编译时或运行时?
如果您在事实上确实有strlen
声明了一个void
返回类型的系统,运行速度极快,可以在其他方向。