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

string length in c without using string library

    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\
    ";

我对此深思了几个小时,但还是想不通.. 仅使用 stdio.h

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

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

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

ex) ha => 2, di => 1..

帮助我。

关于字符串的长度,strlen的实现不是很复杂。
您应该做的就是循环遍历字符串,直到找到 [=13=](字符串结尾)并计算循环次数。

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

这可以缩短为

unsigned int len = 0;
for (; str[len]; len++);

纯C 中的字符串只是指向内存的指针。 如果最后一个元素是 0,那么你可以使用 strlen 或任何检查。 但如果不是这种情况,您需要记住变量中的长度。

因此,如果它以 0 结尾,则只需循环到第一个为 0(不是“0”)的元素,这就是结尾。如果你计算你有字符串长度的元素。

这适用于一些测试输入字符串,但我强烈建议在更多情况下检查它。

假设我们已经实现了strstr()

strstr()

是来自string.h

的C库函数

char *strstr(const char *haystack, const char *needle)

此函数查找子字符串 needle 在源字符串 haystack 中的第一次出现。

不比较终止 [=18=] 个字符。

source: TutorialsPoint (有一些版本)

代码

#include <stdio.h>

#include <string.h>


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

int BluePIXYstrlen(char* str)
{
    int len = 0;
    sscanf(str, "%*[^0]%n", &len);

    return len;
}

int Jeanfransvastrlen(char* str)
{
    int i;
    for (i=0;str[i];i++);   
    return i;
}    


int main(int argc, char **argv){

//is it true, no need to malloc????

char* str =
    "\
    P-P-A-P\
    I have a pen, I have a apple\
    Uh! Apple-Pen!\
    I have a pen, I have pineapple\
    Uh! Pineapple-Pen!\
    Apple-Pen, Pineapple-Pen\
    Uh! Pen-Pineapple-Apple-Pen\
    Pen-Pineapple-Apple-Pen\
    ";


    printf("len: %d\n", Jeanfransvastrlen(str));
    printf("len: %d\n", Neostrlen(str));
    printf("len: %d\n", BluePIXYstrlen(str));

    printf("sss:%s\n\n\n", str);

    char * search = "have";//search for this substring
    int lenSr= Neostrlen(search);

    printf("lenSr: %d\n", lenSr); 


    char * ret;
    ret = strstr(str, search);

    int count = 0;

    while (ret){
        //printf("The substring is: %s\n\n\n\n", ret);
        count++;
        for (int i=0;i<lenSr;i++){
            printf("%c", ret[i]);
        }

            printf("\nEnd sub\n");


        for (int i=0;i<lenSr;i++){
            ret++;      
        }
        ret = strstr(ret, search);
    }
    printf("count: %d\n", count);


    return 0;
}

已编辑

如果仅使用 stdio.h,您可以将所有 strstr() 替换为从 leetcode

采纳的 mystrstr() 版本

mystrstr()

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

提示

  1. 我从 mystrstr() 的第一个第一个参数中删除了 const 因为我想稍后更改它,这是我对原始代码所做的唯一更改。

  2. 此版本对字符串中的大小写字母敏感, 例如 Apple 不同于 apple.

  3. 正如 chux 在评论中所说,我的代码 return "ababa" 的子字符串来自源代码 "aba" 只有 {aba} 没有更多。这是因为我在最后 for 中更改了 while 内的字符串指针。

建议

尝试实施您的 strstr()strlen()

版本