0

我有一个 C++ 类型的字符串const char*作为参数传递给 strlen,但它返回 void。

它就像

strlen(astruct.string);

谢谢..

编辑:做了一些检查,

strlen("test");

仍然无效..为什么?

编辑:这是图片 http://img14.imageshack.us/img14/1808/strlen.png

抱歉之前不清楚。格式化不是很好。无论如何,Evan Teran 和 Vlad Romascanu 都解决了这个困惑。另请查看 Brian R. Bondy 的回答。

谢谢。随意关闭。

4

6 回答 6

6

你被 Visual Studio 6.0 的蹩脚调试器弄糊涂了。不要依赖这个。由于内联或类似的原因,它可能无法获得返回值。

将值打印出来以获得实际值。

编辑:另外,从您的示例来看,您似乎无论如何都不会存储 strlen 的结果。这也可能是调试器看不到返回值的原因。如果您不使用该值,编译器完全有可能认为它不需要实际执行 strlen 。

注意:在这一点上,没有任何理由继续使用 VC++ 6.0。它是一个古老的编译器和 IDE,是一个令人尴尬的糟糕 c++ 编译器。Visual c++ 编译器的较新版本是免费的(没有 IDE),请使用它们。

于 2009-02-23T03:19:22.407 回答
4

strlen 不是返回类型 void,它是您的调试器没有给出正确的消息。

为什么你的调试器显示无效?

您正在使用的 strlen 的实现可能包含在 #define strlen someothername_strlen 周围。

调试器可能不正确支持#define 或函数上的一些其他修饰符。

您必须执行 iLen = strlen("test") 之类的操作,然后在手表中检查 iLen。

通常您可以调用手表中的函数。例如,尝试定义以下函数,然后在您的手表中调用它:

int testFunc(char*)
{
  return 5;
}

结果,您可能会在手表中获得 5。

于 2009-02-23T03:11:57.107 回答
3

参考您的屏幕截图:您的调试器正在显示<void>strlen(...)实际上它应该显示错误。

您不能调用方法并在调试器监视中显示它们的结果。调试器将仅显示现有变量和数据。它不能按需调用任意方法,因为这些方法可以以代码作者和调试器都没有预料到的方式改变正在调试的程序的状态。

您可以做的是,在您的代码中,临时添加:

size_t tmp_len = strlen(struc.string);

然后编译,并将 tmp_len 添加到手表。

于 2009-02-23T03:00:02.423 回答
0

strlen 返回一个整数,所以我假设您的意思是它返回“0”。

此外,您指定数据类型的方式,我无法确定它是 const char * 还是 const char **。如果是后者,那么您需要确保将 ** 取消引用为单个 *。

我的猜测是字符串以空字节开头,这就是它返回 0 的原因。

于 2009-02-23T02:57:53.693 回答
0

在 C++ 中,函数总是返回一个它们被声明返回的类型的值。由于strlen函数声明看起来像这样:

size_t strlen(const char *);

它唯一可能返回的是一个size_t. 编译器在编译时使用此信息来确定在调用函数时如何处理返回值。这里的要点是,如果strlen函数如上声明,它不能决定有时返回void而有时返回一个类型的值size_t

这通常是 C++ 等静态类型语言的特征。在动态类型语言(Perl、Python、Ruby、PHP 等)中,函数可以决定在每次调用时返回任何类型的值。

于 2009-02-23T03:45:19.427 回答
-2

它不能返回无效。Void 是缺少返回值,所以你不能错误地返回它。

无论如何,您如何检查无效?Void 不是一个值。请证明你是如何变得无效的。是编译时还是运行时?

如果您确实有一个strlen声明了void返回类型的系统,请尽可能快地朝另一个方向运行。

于 2009-02-23T03:04:05.067 回答