在C中复制Strlen函数

时间:2017-09-07 09:47:01

标签: c strlen

我一直在研究我的C赋值,我尝试复制strlen()函数而不实际使用它。这是我一直努力工作的代码。但是,不知何故,主要功能并没有反映出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;
}

2 个答案:

答案 0 :(得分:1)

此:

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;
}

这基本上围绕int - 至 - size_t更改。另请注意,在支持引用的shell中,您可以像这样运行程序:

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

它将在argv[1]中传递整个引用的字符串(当然没有引号)。

答案 1 :(得分:0)

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