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

时间:2017-09-28 14:37:50

标签: c string-length

<!--

我深思这个好几个小时但是不能弄清楚.. 仅使用stdio.h

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

我怎样才能获得字符串长度?有人请帮帮我。

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

ex)ha =&gt; 2,di =&gt; 1 ..

帮帮我。

3 个答案:

答案 0 :(得分:3)

至于字符串的长度,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++);

答案 1 :(得分:0)

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

因此,如果它是0终止只是循环到第一个元素是0(不是&#39; 0&#39;),那就结束了。如果您计算了元素,那么你就有了字符串长度。

答案 2 :(得分:0)

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

假设我们已实施strstr()

<强> strstr()

来自string.h

的C库函数

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,您可以使用leetcode

采用的strstr()版本替换所有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. 我从const的第一个参数中删除了mystrstr()因为我想稍后更改它,这是我对原始代码所做的唯一更改。

    < / LI>
  2. 此版本对字符串中的大写和小写字母很敏感, 例如,Appleapple不同。

  3. 正如chux在评论中所说,我的代码从源代码返回"ababa"的子字符串 仅"aba" {aba}而不是while。这是因为我在最后for中更改了strstr()内的字符串指针。

  4. <强>建议

    尝试实施您的strlen()number

    版本