programing

포인터가 가리키는 문자열 크기 찾기

newsource 2023. 10. 12. 23:19

포인터가 가리키는 문자열 크기 찾기

#include <stdio.h>

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

}

ptr의 크기가 항상 4를 주는데 ptr이 가리키는 스택 오버플로우의 길이를 찾을 수 있는 방법이 있습니까?

strlen을 사용하여 문자열의 길이(문자 수)를 찾습니다.

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

또 하나의 사소한 점, 주목할 점은ptr는 문자열 리터럴(수정할 수 없는 const memory에 대한 포인터)입니다.이것을 보여주는 것을 상수로 선언하는 것이 더 좋은 연습입니다.

  1. sizeof()유형에 필요한 크기를 반환합니다.이 경우 크기로 전달하는 유형은 포인터이므로 포인터의 크기를 반환합니다.

    포인터가 가리키는 데이터의 크기가 필요한 경우 명시적으로 저장하여 기억해야 합니다.

  2. sizeof()컴파일 타임에 작동하기 때문에.sizeof(ptr)할 것이다return 4 or 8 bytes일반적으로.대신 사용strlen.

에서 제공하는 기능string.h는 인수가 가리키는 문자열에 포함된 "실제 문자" 수를 알려줍니다.그러나 이 길이는 종결 Null 문자를 포함하지 않습니다.'\0'; 메모리 할당에 필요한 길이라면 고려해야 합니다.

그 4바이트는 당신의 플랫폼에 있는 char의 포인터 크기입니다.

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

알기 쉬운 코드

당신은 그 기능을 찾고 있습니다.

다음을 사용해 볼 수 있습니다.

char *ptr = "stackoverflow"
size_t len = strlen(ptr);

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

포인터를 순수하게 사용하면 포인터 산술을 사용할 수 있습니다.

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 */
}

일반적인 C 질문이긴 하지만, C++에 대해 이 질문을 검색할 때 꽤 높은 적중률을 기록합니다.저는 C/C++ 영역에 있었을 뿐만 아니라 마이크로소프트의 SDL(Security Development Lifecycle) 금지 기능 호출을 염두에 두어야 했습니다. 특정 프로젝트에 대한 금지 기능 호출은strlen이 때문에 금지입니다.

익명의 인터넷 연결을 허용하는 것과 같은 중요한 응용 프로그램의 경우, strlen 또한 교체해야 합니다...

어쨌든, 이 답변은 기본적으로 다른 사람들의 답변에 대한 왜곡일 뿐이지만 승인된 Microsoft C++ 대체 기능 호출과 C99의 업데이트된 제한인 65,535바이트와 관련하여 넓은 문자 처리에 대한 고려 사항이 있습니다.

#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

strlen()' ]['\0'외]다를 합니다.

sizeof()사용되는 데이터 유형의 크기를 제공합니다.

// stackoverflow = 13 Characters
const char* ptr = "stackoverflow";

strlen(ptr);             // 13 bytes - exact size (NOT includes '\0')
sizeof(ptr);             // 4  bytes - Size of integer pointer used by the platform
sizeof(*ptr);            // 1  byte  - Size of char data type

strlen("stackoverflow"); // 13 bytes - exact size
sizeof("stackoverflow"); // 14 bytes - includes '\0'
#include<stdio.h>

int main() {
char *pt = "String of pointer";
int i = 0;
while (*pt != '\0') {
    i++;
    pt++;
}
printf("Length of String : %d", i);
return 0;
}

사용할 수도 있습니다.strlen()nsizeof()C에 내장된 연산자.위의 예와 같이 포인터 산술의 도움을 받을 수도 있습니다.

언급URL : https://stackoverflow.com/questions/13551017/find-the-size-of-a-string-pointed-by-a-pointer