在 C 中复制 Strlen 函数

Replicating the Strlen function in C

我一直在做我的 C 作业,我尝试在不实际使用它的情况下复制 strlen() 函数。这是我一直试图开始工作的代码。然而,不知何故 main 函数并没有反映 mystrlen() 函数中发生的事情。你能告诉我为什么它不能像 strlen() 函数那样工作吗?

#include <stdio.h>

int mystrlen(char *input_string) {
/* This function returns the length of the input string */
/* WRITE FUNCTION CODE HERE! */
    char str1[50];
    int abcd = 0;
    scanf("%s", str1);
    int m;
    for(m=0; str1[m]; m++){
        abcd ++;
    }
    return 0;
}

int main(int argc, char **argv) {
    int length;
    if (argc!=2) {
        printf("Usage: strlen <input_string_with_no_space_inside_it>\n\n");
    return 1;
    }
    length = mystrlen(argv[1]);
    printf("The length is: %d characters.\n",length);
    return 0;
}

这个:

return 0;

应该是:

return abcd;

就是说,abcd 是这个变量的糟糕名称,而且该函数作为 strlen() 替换没有什么意义。它没有触及它的参数,并调用 scanf() 来读取用户的输入,你真的不希望 strlen() 替换来做。

这是一种写法:

size_t mystrlen(const char *s)
{
  size_t len = 0;
  if(s != NULL)
  {
    while(*s != '[=12=]')
    {
      ++len;
      ++s;
    }
  }
  return len;
}

改进包括:

  • 正确的 size_t 类型的 return 值(长度是大小,不能为负数)所以 size_t 是正确的,真正的 strlen() 使用什么。
  • 不进行任何输入读取。
  • 使用输入参数。
  • 计算长度并return计算长度。

它也处理被给予 NULL 作为奖励。

一个匹配的 main() 可以做你所做的事情:

int main(int argc, char **argv)
{
  if (argc != 2)
  {
    printf("Usage: strlen <input_string_with_no_space_inside_it>\n\n");
    return 1;
  }
  const size_t length = mystrlen(argv[1]);
  printf("The length is: %zu characters.\n", length);
  return 0;
}

这基本上围绕着 intsize_t 的变化。另请注意,在支持引用的 shell 中,您可以像这样 运行 您的程序:

$ ./strlen "hello this is a string with spaces in it"

并且它将在 argv[1].

中传递整个带引号的字符串(当然没有引号)

首先,你尝试传递一个字符串,然后调用mystrlen中的scanf函数。删除这个scanf。 其次,你的函数总是 returns 零而不是变量 abcd 的值。