c - 在 C 中复制 Strlen 函数

标签 c strlen

我一直在做我的 C 作业,我尝试复制 strlen() 函数而不实际使用它。这是我一直在努力工作的代码。然而,不知何故, main 函数并没有反射(reflect) 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 != '\0')
    {
      ++len;
      ++s;
    }
  }
  return len;
}

改进包括:

  • 正确的 size_t 类型的返回值(长度是大小,不能为负),因此 size_t 是正确的,并且是真正的 strlen() 用途。
  • 不执行任何输入读取。
  • 使用输入参数。
  • 计算长度并返回它。

作为奖励,它还可以处理给予 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] 中传递整个带引号的字符串(当然没有引号)。

关于c - 在 C 中复制 Strlen 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46093159/

相关文章:

c - 为什么程序返回访问冲突?

php - PHP 中 strlen() 函数的源代码在哪里?

c - strlen 没有给出正确的字符串长度 C

c - 独立可移植的snprintf(),独立于标准库?

c++ - 如何打印 pthread_t

php - 我如何在波斯语的 php 中使用 strlen?

c - argv 字符串上的 malloc 错误

php - 如何在PHP中的特定字/字符限制后添加“…”?

c - 默认 GCcflags

c - 服务器打印到标准输出而不是套接字