代码之家  ›  专栏  ›  技术社区  ›  jwkoo

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

  •  2
  • jwkoo  · 技术社区  · 7 年前
        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\
        ";
    

    一串h是不允许的,但只使用基本的东西。。

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

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

    帮助我。

    3 回复  |  直到 7 年前
        1
  •  5
  •   Neo    7 年前

    至于字符串的长度 strlen 不是很复杂。
    \0 (字符串末尾)并计算循环次数。

    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++);
    
        2
  •  0
  •   chris01    7 年前

    如果最后一个元素为0,则可以使用strlen或任何检查该元素的方法。 但如果不是这样,你需要记住变量的长度。

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

        3
  •  0
  •   EsmaeelE Anonymo    7 年前

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

    strstr()

    是来自的C库函数 string.h 图书馆

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

    此函数用于查找子字符串的第一个匹配项 needle 在源字符串中 haystack .

    \0

    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() 使用此版本的 mystrstr() leetcode

    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. const mystrstr() 因为我想以后再修改,这是我对原始代码所做的唯一修改。

    2. 例如 Apple apple

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

    strlen()