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

时间:2014-04-26 18:55:28

标签: c string strcmp strcpy strcat

我的教授向我们展示了函数的示例实现,以查找字符串的长度,并说这是在没有实际使用strlen()函数的情况下执行此操作的方法:

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

        }
    }
    return i;
 }

她说,对strcat()strcmp()strcpy()执行类似操作符合我们的最佳利益,以了解函数的实际工作方式。

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

3 个答案:

答案 0 :(得分:1)

关于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.
}

答案 1 :(得分:1)

您似乎在问多个问题,我会尝试回答您的第一个问题。

您的上述功能无效,无法编译或工作。

这是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中的strings表示为字符数组。必须有一种逻辑方式来表示字符串的结尾,在我们的例子中是空字符\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;见男人3 strcat

strcat中,字符从t复制(顺序)到s的末尾。常见的C语言是在循环中递增步进变量。复制每个字符时,步进变量将递增到下一个字符的位置。

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

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

答案 2 :(得分:1)

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

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

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

for循环将:

  1. 执行初始条件
  2. 执行测试条件,如果它为TRUE(非零)将执行某些代码。否则,如果它为FALSE(零),它将退出循环并在循环后转到代码
  3. 执行循环表达式
  4. 转到2
  5. 有了基础知识,让我们看一下老师给出的功能:

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

    函数的主要部分是for循环:然后经过for循环步骤:

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

      1. i设为0
      2. 检查word[0] != '\0',检查'c' != '\0'。这是正确的,因为'c'不等于'\0'
      3. 选择i++(增量i),现在i1
      4. 检查word[1] != '\0',检查'a' != '\0'。这是正确的,因为'a'不等于'\0'
      5. 选择i++(增量i),现在i2
      6. 检查word[2] != '\0',检查't' != '\0'。这是正确的,因为't'不等于'\0'
      7. 选择i++(增量i),现在i3
      8. 检查word[3] != '\0',检查'\0' != '\0'。这是假的,因为'\0'等于'\0'
      9. 循环结束,因为测试条件已变为FALSE。
      10. 循环结束时i的值是多少?它是3,这是字符串的长度,因为我们一直踩过字符串,一次一个字符,从i递增0直到我们点击之后字符串的最后一个字符,即'\0'

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

        HTH