【问题标题】:Replicating the Strlen function in C [closed]在 C 中复制 Strlen 函数
【发布时间】:2017-09-07 09:47:01
【问题描述】:

我一直在处理我的 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;
}

【问题讨论】:

  • 函数总是返回0 (return 0;)
  • 这样做: int mystrlen(const char *data) { int counter = 0;而(*数据++){计数器++; } 返回计数器; }
  • 您的解决方案根本无法复制 strlen 函数。
  • 你从不使用input_string
  • @OrhanGaziYalçın 没有人要求您更改 input_string

标签: c strlen


【解决方案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-typed 返回值(长度是大小,不能为负数)所以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-to-size_t 更改。另请注意,在支持引用的 shell 中,您可以像这样运行程序:

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

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

【讨论】:

  • @nicomp 好的,您能更具体地谈谈您遇到的问题吗? main() 中的代码看起来很正常,所以我没有复制它。
  • main() 中有很多疯狂之处。
  • @nicomp 你能更具体一点吗?除了格式不好之外,main 函数对我来说看起来还不错。
  • @MichaelWalz 查看另一位用户在下面发布的答案:“首先,您尝试传递一个字符串,然后在 mystrlen 中调用 scanf 函数。删除此 scanf。其次,您的函数总是返回零而不是变量 abcd 的值。"
  • @nicomp this 答案的 cmets 应该只与 this 答案有关,而不是其他答案。我仍然不明白您的评论:“main() 中有很多疯狂之处。”
【解决方案2】:

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

【讨论】:

  • 这是一个评论而不是一个答案,你为什么不详细说明一下?
  • 虽然这可能是解决问题的宝贵提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,考虑将其写为评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2015-07-29
  • 2011-08-14
  • 2017-01-19
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多