strlen函数总是返回0
strlen function always returning 0
对于家庭作业,我们必须编写一个简短的程序,使用argc和argv"告诉"传递给main的参数数量、它们的数据地址以及每个参数是什么。我们还必须编写一个名为strlen的函数(我们不允许使用库中包含的任何类似函数),该函数通过使用指针来计算传递给main的每个参数的长度。我的函数总是返回0。很抱歉,我问了这么一个基本的问题,但作为一名一年级学生,我还没有接受过使用调试器的培训。这是我的代码:
int strlen(char * p)
{
char X[50];
p = &X[0];
int i = 0;
while (*(p + i) != ' ')
i++;
return i;
}
我尝试了几种不同的方法来解决这个问题,但无论函数如何,它似乎总是返回值0。有没有一个我忽视的巨大问题?任何朝着正确的方向推动都会有帮助,但请不要只给我答案。
您编写了一个函数来计算本地"字符串"X
的长度。阵列X
甚至未初始化。里面有垃圾。函数返回该垃圾字符串的长度。它不一定是0
,只是在你的实验中意外地为零。在一般情况下,您的函数将返回一个垃圾值,或者只是导致程序崩溃。行为未定义。
换句话说,当您将函数调用为strlen("hello")
时,您编写的代码将完全忽略"hello"
字符串。您的函数仍然坚持使用本地数组X
,而不是从外部传递的参数字符串"hello"
。
如果是你编写了这个函数,那么你真的有一个问题:你为什么要这样做?
p.S.strlen
的更合理的实现可能会接收const char *
参数(而不是char *
),并在size_t
类型的域(而非int
)中执行计数。
p.p.S.*(p + i)
相当于p[i]
。许多人会发现后者比前者更可读。
首先,您的函数毫无意义;它覆盖了参数,数组X没有初始化,所以它的元素有一些未指定的值,并且使用此函数的程序有未定义的行为。该功能可能看起来像:
size_t strlen( const char * p )
{
size_t i = 0;
while ( *( p + i ) != ' ' ) i++;
return i;
}
或更可读的
size_t strlen( const char * p )
{
size_t i = 0;
while ( p[i] != ' ' ) i++;
return i;
}
例如
#include <iostream>
size_t strlen( const char * p )
{
size_t i = 0;
while ( p[i] != ' ' ) i++;
return i;
}
int main()
{
char s[] = "Hello gsoble";
std::cout << "The size of the greeting is " << strlen( s ) << std::endl;
}
去掉前两行即可。
int strlen(char * p)
{
int i = 0;
while (*(p + i) != ' ')
i++;
return i;
}
工作示例:http://ideone.com/8R8Elu
正如其他答案所解释的,您在这里将p
设置为未初始化的x
,这将导致未定义的行为。然而,另一个答案没有给你的是……递归(因为为什么不呢)
unsigned strlen(const char *p) {
if(*p == ' ') return 0;
return 1 + strlen(p+1);
}
如果你想把它降到1行:
unsigned strlen(const char *p) {
return (*p == ' ') ? 0 : 1 + strlen(p+1);
}
这是未定义的行为。您正在传递X
数组直到' '
,但' '
可能永远不会发生,因为X
是一个具有未定义值的本地对象。相反,您可能会遇到分段错误。
有没有一个我忽视的巨大问题?
您不需要本地数组。你可以从开始
size_t strlen( const char * p) // take const for safety reasons
{ // and return size_t for compatibility
size_t i = 0;
while ( *(p + i) != ' ') ++i;
return i;
}
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数