簡體   English   中英

我想制作自己的 (strlen) function 版本...但是為什么我會出錯

[英]I want to make my own version of (strlen) function...but why i am getting error

#include <stdio.h>

void strlen(char *ptr);

int main()
{
    char string[] = "david";
    int a = strlen(string);

    printf("Number of characters is %d", a);
    return 0;
}

void  strlen(char *ptr)
{
    int count = 0;
    while (*ptr != '\0')
    {
        count++;
        ptr++;
    }
    return count;
}

制作我自己的 (strlen) function 版本

OP 的編譯器正確地抱怨返回值為void function。

使用標准的size_t strlen(const char *s); 帶有非void返回的簽名。

int將處理大多數字符串的長度。 size_t處理所有字符串,是許多 C 庫函數用於調整大小和字符串長度的類型。

// void  strlen(char *ptr)
size_t strlen(const char *ptr) 
{
    // int count = 0;
    size_t count = 0;
    while (*ptr != '\0')
    {
        count++;
        ptr++;
    }
    return count;
}

用法

//int a = strlen(string);
//printf("Number of characters is %d", a);
size_t a = strlen(string);
printf("Number of characters is %zu\n", a);

候選簡化:

size_t strlen(const char *s) {
  const unsigned char *us = (const unsigned char *) s;
  while (*us) {
    us++;
  }
  return (size_t)(us - (const unsigned char *) s);
}

Pedantic:也適用於罕見的有符號非 2 補碼。 OP 的代碼可能會錯誤地停在 -0 上。

您的strlen function 被定義為void ,這意味着它不會返回任何內容。 但是,您期望使用返回值,並且您的 function 嘗試返回一個值。

您需要將其定義為int strlen(char *ptr) ,甚至更好的是int strlen(const char *ptr)因為您沒有修改ptr的內容。

您需要了解,您只需要一個條件來使您的 strlen() 知道任何字符串都以\0結尾,因此通過使用此信息,您可以通過 while 循環 go 直到您str[i] == '\0'這意味着您計算了字符串中的所有字符。

例子

#include <stdio.h>

int ft_strlen(char *str)
{
    int  i = 0;
    while (str[i] != '\0')
        i++;
    return (i);
}

int main() {
    printf("%d", ft_strlen("Hello world"));
}

我建議在這個網站上運行這個例子來自己理解代碼pythontutor.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM