strlen函数总是返回0

strlen function always returning 0

本文关键字:返回 函数 strlen      更新时间:2023-10-16

对于家庭作业,我们必须编写一个简短的程序,使用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;
}