28
#include <stdio.h>

int main ()
{
    char *ptr = "stackoverflow"

}

有没有办法找到ptr指向的stackoverflow的长度,因为sizeof ptr总是给出4

4

9 回答 9

54

使用strlen查找字符串的长度(字符数)

const char *ptr = "stackoverflow";
size_t length = strlen(ptr);

另一个小问题,请注意这ptr是一个字符串文字(指向无法修改的 const 内存的指针)。将其声明为 const 以显示这一点是更好的做法。

于 2012-11-25T12:31:34.567 回答
26
  1. sizeof()返回类型所需的大小。由于在这种情况下传递给 sizeof 的类型是指针,因此它将返回指针的大小。

    如果您需要指针指向的数据的大小,则必须通过显式存储来记住它。

  2. sizeof()在编译时工作。所以,通常sizeof(ptr)return 4 or 8 bytes。而是使用strlen.

于 2012-11-25T12:41:55.603 回答
7

提供的strlen()函数string.h为您提供参数指向的字符串包含多少个“真实字符”。但是,此长度不包括终止空字符'\0';如果您需要分配内存的长度,则必须考虑它。

这 4 个字节是您平台上指向 char 的指针的大小。

于 2012-11-25T12:35:42.760 回答
5
#include<stdio.h>
main()
{
    int mystrlen(char *);
    char str[100];
    char *p;
    p=str;
    printf("Enter the string..?\n");
    scanf("%s",p);
    int x=mystrlen(p);
    printf("Length of string is=%d\n",x);


}
int mystrlen(char *p)
{
    int c=0;
    while(*p!='\0')
    {
        c++;
        *p++;
    }
    return(c);
}

简单易懂的代码

于 2016-01-26T20:41:49.527 回答
2

您正在寻找该strlen()功能。

于 2012-11-25T12:31:40.733 回答
1

您可以尝试使用:

char *ptr = "stackoverflow"
size_t len = strlen(ptr);
于 2012-11-25T12:33:16.340 回答
1

如果 ptr length 是函数的参数,则将指针用作字符串是合理的。我们可以通过以下代码获取字符串长度:

char *ptr = "stackoverflow";
length=strlen((const char *)ptr);

为了进一步解释,如果字符串是用户输入的可变长度字符串,我们可以使用以下代码:

unsigned char *ptr;
ptr=(unsigned char *)calloc(50, sizeof(unsigned char));
scanf("%s",ptr );
length=strlen((const char *)ptr);
于 2014-01-04T07:32:37.277 回答
1

纯粹使用指针,您可以使用指针算术:

int strLen(char *s)
{
    int *p = s;
    while(*p !=’\0’)
    {
        p++;  /* increase the address until the end */
    }
    Return p – s; /* Subtract the two addresses, end - start */
}
于 2017-10-30T13:11:15.137 回答
1

尽管这是一个通用的 C 问题,但在为 C++ 查找此问题时,它的命中率很高。我不仅在 C/C++ 领域,我还必须注意 Microsoft对特定项目的安全开发生命周期 (SDL) 禁止函数调用strlen,该项目因以下原因而被禁止:

对于关键应用程序,例如接受匿名 Internet 连接的应用程序, strlen 也必须更换......

无论如何,这个答案基本上只是对其他答案的一个转折,但是对于C99 更新的 65,535 字节限制,已获得批准的 Microsoft C++ 替代函数调用和宽字符处理的注意事项。

#include <iostream>
#include <Windows.h>
int wmain()
{
    //  1 byte per char, 65535 byte limit per C99 updated standard
    //  https://stackoverflow.com/a/5351964/3543437
    const size_t ASCII_ARRAY_SAFE_SIZE_LIMIT = 65535; 

    //  Theoretical UTF-8 upper byte limit of 6; can typically use 16383 for 4 bytes per char instead:
    //  https://stijndewitt.com/2014/08/09/max-bytes-in-a-utf-8-char/
    const size_t UNICODE_ARRAY_SAFE_SIZE_LIMIT = 10922;

    char ascii_array[] = "ACSCII stuff like ABCD1234.";
    wchar_t unicode_array[] = L"Unicode stuff like → ∞ ∑ Σὲ γνωρίζω τὴν ደሀ ᚦᚫᛏ.";

    char * ascii_array_ptr = &ascii_array[0];
    wchar_t * unicode_array_ptr = &unicode_array[0];

    std::cout << "The string length of the char array is: " << strnlen_s(ascii_array_ptr, ASCII_ARRAY_SAFE_SIZE_LIMIT) << std::endl;
    std::wcout << L"The string length of the wchar_t array is: " << wcsnlen_s(unicode_array_ptr, UNICODE_ARRAY_SAFE_SIZE_LIMIT) << std::endl;

    return 0;
}

输出:

The string length of the char array is: 27
The string length of the wchar_t array is: 47
于 2018-10-03T02:46:03.030 回答