C strlen()的这个基本重新实现是如何找到长度的?

C strlen()的这个基本重新实现是如何找到长度的?,c,string,strcmp,strcpy,strcat,C,String,Strcmp,Strcpy,Strcat,我的教授向我们展示了一个函数的示例实现,该函数用于查找字符串的长度,他说,如果不实际使用strlen()函数,就可以这样做: int length(char word) { int i; for (i = 0; word[i]!='\0'; i++) { { } } return i; } 她说,对我们来说,最好的做法是对strcat()、strcmp()、strcpy()和strcpy()进行类似的操作,以了解函数的

我的教授向我们展示了一个函数的示例实现,该函数用于查找字符串的长度,他说,如果不实际使用
strlen()
函数,就可以这样做:

int length(char word)
{
    int i;
    for (i = 0; word[i]!='\0'; i++)
    {
        {

        }
    }
    return i;
 }
她说,对我们来说,最好的做法是对strcat()、
strcmp()
、strcpy()和
strcpy()进行类似的操作,以了解函数的实际工作方式


这个函数中发生了什么?从这个例子中我能学到什么来帮助我重新实现其他三个吗?

对于strlen,它正在遍历char数组,找到第一个空字节

size_t length( const char * word)
{
    size_t i = 0; // Counter

    while(word[i] != '\0') // Compare current position to null 
    { 
        i++;
    }

    return i; // Return position.
}

你似乎问了很多问题,我将尝试回答你的第一个问题

上述函数无效,无法编译或运行

下面是strlen的一个实现

size_t strlen(char s[])
{
    size_t i;

    i = 0;
    while (s[i]= != '\0') //loop over the array, if null is seen, break
        ++i;
    return i; // return length (without null)

}
关于解释,C中的
字符串
表示为一个字符数组。必须有一种逻辑方式来表示字符串的结尾,在我们的例子中是空字符
\0
。注意,字符串需要
n+1
存储,大多数
strlen
实现返回字符串的长度,不包括空字符

您可能想知道
\0
表示什么,在C中,空字符表示字符常量,ASCII中的值为0。您可以编写0,而不是添加
\0
,以强调字符串的性质

同样,使用指针算法的
strlen
的另一个实现

size_t strlen(char *s)
{
    char *p = s;
    while (*p != '\0')
        ++p;
    return p - s; //use ptrdiff_t or size_t?
}
此外,strcat还提供了良好的措施

void strcat(char s[], char t[])
{
    int j, k;

    j = k = 0;
    while (s[j] != '\0') // are we at the end of s? 
        ++i;
    while ((s[j++] = t[k++]) != '\0') // copy t to s 
        ; // null statement
}
库实现返回指向字符串的指针,而不是void;参见man 3
strcat

strcat
中,字符从
t
复制(顺序)到
s
的末尾。一个常见的C习惯用法是增加循环中的步进变量。复制每个字符时,步进器变量将递增,以便为下一个字符就位

可以使用
void
返回值,因为数组在C中的内部表示形式是指针(通过引用返回)

这个实现中的一个破坏性错误是我们假设
s
足够大,可以容纳所有
s+t+1
。为了简洁起见,我忽略了这个问题

首先,您需要知道什么是C?中的字符串?。字符串是一个非零字节数组(
char
),通常是可打印字符,以null结尾(零,由字符
'\0'
表示)

然后,您需要知道for
循环的
工作原理:

for ( initial condition ; test condition ; loop expression )
{
    // some code
}
// Code after the loop
for
循环将:

  • 执行初始条件
  • 执行测试条件,如果它为真(非零),将执行一些代码。否则,如果为FALSE(零),它将退出循环并转到循环后的代码
  • 执行循环表达式
  • 去2号
  • 先讲完基础知识,让我们看看老师给出的函数:

    int length(char *word)
    {
        int i;
    
        for (i = 0; word[i] != '\0'; i++)
        {
            {
    
            }
        }
    
        return i;
     }
    
    函数的核心是
    for
    循环:然后它将执行
    for
    循环步骤:

  • 最初,
    i
    设置为
    0
    i
    表示字符串中的索引(字符数组)
  • 检查是否
    word[i]!='\0'
    (换句话说,如果这是真的,那么它不是字符串的结尾)。循环中没有要执行的代码,所以我们直接进入步骤3
  • 循环表达式被执行,它递增字符串(
    char
    array)索引
    i
    ,这意味着我们现在指向字符串中的下一个字符
  • 如果单词是“cat”,那么数组是
    {'c','a','t','\0'}
    。因此,循环步骤将执行以下操作:

  • i
    设置为
    0
  • 选中
    word[0]!='\0'
    ,它检查
    'c'!='\0'
    。这是正确的,因为
    'c'
    不等于
    '\0'
  • i++
    (增量
    i
    )为例,现在
    i
    1
  • 检查
    word[1]!='\0'
    ,它检查
    'a'!='\0'
    。这是正确的,因为
    'a'
    不等于
    '\0'
  • i++
    (增量
    i
    )为例,现在
    i
    2
  • 检查
    word[2]!='\0'
    ,它检查
    't'!='\0'
    。这是正确的,因为
    't'
    不等于
    '\0'
  • i++
    (增量
    i
    )为例,现在
    i
    3
  • 检查
    word[3]!='\0'
    ,它检查
    “\0'!=”\0'
    。这是错误的,因为
    '\0'
    等于
    '\0'
  • 循环现在结束,因为测试条件变为FALSE
  • 循环结束时
    i
    的值是多少?它是
    3
    ,这是字符串的长度,因为我们一直在字符串中单步执行,每次执行一个字符,从
    0
    开始递增
    i
    ,直到我们到达字符串最后一个字符后的位置,即
    '\0'

    然后,函数返回字符串的长度
    i


    HTH

    我想这个想法是,尝试实现这些函数可以让您更深入地理解字符串以及这些函数的作用。为什么不试着写一些代码呢?例如,学习你似乎在问,重新实现库函数来学习它们的工作原理是否值得。对是的。然而,在实际代码中,您将使用标准函数。您的老师给了您一个问题的答案,即如何在不使用strlen
    的情况下实现字符串长度函数(顺便说一句,除了语法冗余的空大括号外,这是一个很好的示例),她要求你对strcat、
    strcat
    strcmp
    做类似的事情。首先,试着去理解