不使用字符串库的c中的字符串长度

不使用字符串库的c中的字符串长度,c,string-length,C,String Length,我对此深思熟虑了好几个小时,但还是想不出来。。 仅使用stdio.h string.h是不允许的,但只使用基本的东西 如何获取字符串长度?有人请帮帮我 目标是找到给定字符串中输入模式的频率 ex ha=>2,di=>1 帮帮我。至于字符串的长度,strlen的实现并不复杂。 您只需在字符串上循环,直到找到字符串的\0结尾,并计算循环次数 char* str = "\ a-a-a-a\ differing the text, because that was the

我对此深思熟虑了好几个小时,但还是想不出来。。 仅使用stdio.h

string.h是不允许的,但只使用基本的东西

如何获取字符串长度?有人请帮帮我


目标是找到给定字符串中输入模式的频率

ex ha=>2,di=>1


帮帮我。

至于字符串的长度,strlen的实现并不复杂。 您只需在字符串上循环,直到找到字符串的\0结尾,并计算循环次数

    char* str =
    "\
    a-a-a-a\
    differing the text, because that was the lecture thing\
    the text has been changed\
    I know!\
    the text has been changed\
    ";
这可以缩短为

unsigned int mystrlen(const char* str)
{
    unsigned int length = 0;
    while (*str != 0)
    {
        str++;
        length++;
    }
    return length;
}

至于字符串的长度,strlen的实现并不复杂。 您只需在字符串上循环,直到找到字符串的\0结尾,并计算循环次数

    char* str =
    "\
    a-a-a-a\
    differing the text, because that was the lecture thing\
    the text has been changed\
    I know!\
    the text has been changed\
    ";
这可以缩短为

unsigned int mystrlen(const char* str)
{
    unsigned int length = 0;
    while (*str != 0)
    {
        str++;
        length++;
    }
    return length;
}

纯C中的字符串只是指向内存的指针。 如果最后一个元素为0,则可以使用strlen或任何检查该元素的方法。 但如果不是这样,你需要记住变量的长度


因此,如果它以0结尾,只需循环到第一个元素,即0而不是“0”,这就是结束。如果你计算了元素,你就得到了字符串长度。

纯C语言中的字符串只是指向内存的指针。 如果最后一个元素为0,则可以使用strlen或任何检查该元素的方法。 但如果不是这样,你需要记住变量的长度


因此,如果它以0结尾,只需循环到第一个元素,即0而不是“0”,这就是结束。如果你计算了元素,你就得到了字符串长度。

这对一些测试输入字符串有效,但我强烈建议用更多的例子来检查它

假设我们已经实现了strstr

strstr

是string.h库中的C库函数

char*strstrconst char*干草堆,const char*针

此函数用于查找源字符串haystack中第一个出现的子字符串指针

不比较终止字符\0

有些版本

代码

暗示

我从mystrstrstr的第一个参数中删除了const,因为我想在以后更改它,这是我对原始代码所做的唯一更改

此版本对字符串中的大小写字母敏感, 例如,苹果与苹果不同

正如chux在评论中所说,我的代码从源代码返回ababa的子字符串 只有aba{aba}没有更多。这是因为我改变了字符串指针,而在最后一个

暗示


尝试实现您的strstrstr版本,strlen

这适用于某些测试输入字符串,但我强烈建议使用更多的案例来检查它

假设我们已经实现了strstr

strstr

是string.h库中的C库函数

char*strstrconst char*干草堆,const char*针

此函数用于查找源字符串haystack中第一个出现的子字符串指针

不比较终止字符\0

有些版本

代码

暗示

我从mystrstrstr的第一个参数中删除了const,因为我想在以后更改它,这是我对原始代码所做的唯一更改

此版本对字符串中的大小写字母敏感, 例如,苹果与苹果不同

正如chux在评论中所说,我的代码从源代码返回ababa的子字符串 只有aba{aba}没有更多。这是因为我改变了字符串指针,而在最后一个

暗示


尝试实现您的strstr版本,对于i=0,使用strlen

;str[i];i++;。这将有助于您更详细地解释它?如果您确实有可用的库函数,那么您可以按照编写代码的方式来分解它,然后手动实现缺少的库函数。@BrianCain我知道,但是在给定字符串中计算子字符串的频率太复杂和太广泛了…在给定字符串中查找输入模式的频率->如果字符串是aba,模式是aba,那么会计为1或2次出现吗?对于i=0;str[i];i++;。这将有助于您更详细地解释它?如果您确实有可用的库函数,那么您可以按照编写代码的方式来分解它,然后手动实现缺少的库函数。@BrianCain我知道,但是在给定字符串中计算子字符串的频率太复杂和太宽了…在给定字符串中查找输入模式的频率->如果字符串是aba,模式是aba,那么会计算为1或2次出现吗?小调:strlen返回一个大小,而不是int。@chux我可以自由使用int。毕竟,这是我的strlen:然而,实际上,使用无符号返回值更好,Iguess@chux感谢您的专家评论,您是否有一些东西表明使用size\u t比int或unsigned int更好,我认为在旧平台上使用size\u t不会有一些问题。自从C89/90以来
,使用include定义大小。对于标准前代码,>37岁的用户,您只能依靠自己,这不是标准解决方案。因此,我会跟随你的无符号。小调:strlen返回一个size\u t,而不是int。@chux我自由地使用int。毕竟这是我的strlen:不过,使用无符号返回值确实更好,我guess@chux感谢您的专家评论,您是否有一些东西表明使用size\u t比int或unsigned int更好,我认为在旧的平台上使用大小不会有问题。自从C89/90以来,使用include来定义大小。对于标准前代码,>37岁的用户,您只能依靠自己,这不是标准解决方案。为此,我会跟随你的未签名。
char* mystrstr(char *str, const char *target) {

  if (!*target) {
    return str;
  }

  char *p1 = (char*)str;

  while (*p1) {

    char *p1Begin = p1, *p2 = (char*)target;
    while (*p1 && *p2 && *p1 == *p2) {
      p1++;
      p2++;

    }

    if (!*p2){
      return p1Begin;
    }

    p1 = p1Begin + 1;
  }

  return NULL;
}