programing

char *(char 배열)의 실제 길이와 전체 길이를 얻는 방법

shortcode 2022. 8. 16. 21:21
반응형

char *(char 배열)의 실제 길이와 전체 길이를 얻는 방법

char []이치하다

char a[] = "aaaaa";
int length = sizeof(a)/sizeof(char); // length=6

이렇게 , 는, 나, 나, 나의 은 할 수 없습니다.char * 삭제:

char *a = new char[10];
int length = sizeof(a)/sizeof(char);

도 알아, ,, , because,a포인터가 .length 에 있을 이다.4(무엇을 사용하다)

만, 어떻게 of가의 수 요?char *그 후에?누군가가 당신이 그것을 창조했기 때문에 이미 알고 있다고 나에게 이의를 제기할 수도 있다는 것을 알고 있습니다. 길이를 구하는 이 단계는 작성부터 먼 곳까지 올 수 있고, 이 숫자를 확인하기 위해 먼 곳까지 오고 싶지 않기 때문에 알고 싶습니다. 또한 실제 길이도 알고 싶습니다.

좀 더 구체적으로 말하면

  • 진짜를 수 요?length=5
  • 합계를 수 요?length=10

예를 들어 다음과 같습니다.

char *a = new char[10]; 
strcpy(a, "hello");

그럴수는 없어요.어쨌든 100% 정확하진 않아요포인터에 길이/사이즈는 없고 포인터 자체의 크기만 있습니다.다만, 기억의 특정의 장소를 가리키고 있을 뿐입니다.만약 그 문자가 문자열의 일부라면strlen현재 표시된 문자 뒤에 나타나는 문자를 판별할 수 있지만, 이 경우 배열이 그렇게 크다는 의미는 아닙니다.
★★★★★★★★★★★★★★★★★★:

포인터배열이 아니므로 배열 크기를 알 필요가 없습니다.포인터는 단일 값을 가리킬 수 있으므로 배열이 없어도 포인터가 존재할 수 있습니다.가리키는 메모리의 위치(읽기 전용, 힙, 스택 등)는 신경 쓰지 않습니다.상관없습니다.)포인터에는 자신 이외의 길이가 없습니다.포인터는 그냥...
이치노

char beep = '\a';
void alert_user(const char *msg, char *signal); //for some reason
alert_user("Hear my super-awsome noise!", &beep); //passing pointer to single char!

void alert_user(const char *msg, char *signal)
{
    printf("%s%c\n", msg, *signal);
}

포인터는 단일 문자일 뿐만 아니라 배열의 시작, 끝 또는 중간 문자일 수 있습니다.
문자를 구조물로 생각해 보세요.을 사용하다또한 배열 없이 포인터가 생성됩니다.

포인터만으로 어레이의 크기를 판단할 수 없습니다. 것은 '아까운'을 사용하는 입니다.calloc포인터를 통해 찾을 수 있는 연속된 \0 문자 수를 카운트합니다.물론 어레이의 키에 데이터를 할당/재할당하면 동작하지 않습니다.또, 어레이의 바로 에 있는 메모리가 보관 유지되었을 경우에도 동작하지 않습니다.\0그래서 이 방법을 사용하는 것은 믿을 수 없고, 위험하고, 그저 어리석다.하지 마, 하지 마그거에요.

또 다른 비유:
포인터를 도로 표지판이라고 생각하면 X타운을 가리키고 있습니다.그 표지판은 그 마을이 어떻게 생겼는지도 모르고, 거기에 누가 사는지 알지도, 관심도 관심도 없다.X타운을 찾을 수 있는 곳을 알려주는 게 직업이야그 마을이 얼마나 먼지는 말해줄 수 있을 뿐 얼마나 큰지는 말해줄 수 없어.그 정보는 도로 표지판과 무관하다고 여겨진다.그건 마을 자체를 봐야 알 수 있지 방향을 가리키는 표지판이 아니라

따라서 포인터를 사용할 수 있는 유일한 방법은 다음과 같습니다.

char a_str[] = "hello";//{h,e,l,l,o,\0}
char *arr_ptr = &a_str[0];
printf("Get length of string -> %d\n", strlen(arr_ptr));

단, 이것은 어레이/문자열이 \0 종단되어 있는 경우에만 기능합니다.

여백으로서:

int length = sizeof(a)/sizeof(char);//sizeof char is guaranteed 1, so sizeof(a) is enough

실제로 할당하고 있습니다.size_t(반환 타입)sizeof)에 대해서int, 베스트 라이터:

size_t length = sizeof(a)/sizeof(*a);//best use ptr's type -> good habit

부터size_t는 부호 없는 타입입니다.sizeof더 큰 값, 더 큰 값,length생각지도 못한 일일 수도 있고...

이 경우,char *0 끝입니다.strlen

그렇지 않으면 이 정보를 확인할 수 없습니다.

방법은 두 가지뿐입니다.

  • 에 대한 메모리 포인터가char *C 스트링(즉, 끝부분을 표시하기 위해0 바이트의 문자를 포함한다)을 나타냅니다.strlen(a).

  • 그렇지 않으면 길이를 어딘가에 저장해야 합니다.사실 포인터는 1개만 가리킵니다. char그러나 배열의 첫 번째 요소를 가리키는 것으로 간주할 수 있습니다.어레이의 "길이"를 알 수 없기 때문에 해당 정보를 어딘가에 저장해야 합니다.

연산자 크기는 연산자를 저장하는 데 필요한 스토리지 양(바이트)을 반환합니다.

문자를 저장하는 데 필요한 저장소의 양은 항상 1바이트입니다.그래서...sizeof(char)는 항상 1을 반환합니다.

char a[] = "aaaaa";

int len1 = sizeof(a)/sizeof(char); // length = 6
int len2 = sizeof(a);              // length = 6;

이것은 양쪽 모두 동일합니다.len1그리고.len2왜냐하면 이 나눗셈 1은 방정식에 영향을 주지 않기 때문이다.

둘 다len1그리고.len2문자열 끝 문자와 관련된 값 6을 전달합니다.'\0'. 길이에 다른 문자를 추가하는 문자이기도 합니다.따라서 예상한 5가 아닌 6이 됩니다.

char *a = new char[10];
int length = sizeof(a)/sizeof(char);

여기서 길이가 4라고 하셨는데, 맞습니다.다시 size of operator는 피연산자에 대한 스토리지 양을 반환합니다.이 경우, 이 값은 포인터입니다.a포인터에는 4바이트의 스토리지가 필요하므로 이 경우 길이는 4바이트입니다.아마 32비트 바이너리로 컴파일 했을 테니까요.8.64입니다.

이 설명은 이미 여기에 있을 수 있습니다.그냥 내 의견을 나누고 싶어

  • C++의 경우:

쓰세요.std::vector<char>(서양속담, 노력속담)(Bonus, 메모리 관리는 무료입니다.

★★★std::array<char, 10>(정적) 크기를 유지합니다.

  • 순수 C:

다음과 같은 정보를 보관하는 구조를 만듭니다.

typedef struct {
    char* ptr;
    int size;
} my_array;

my_array malloc_array(int size)
{
    my_array res;
    res.ptr = (char*) malloc(size);
    res.size = size;
    return res;
}

void free_array(my_array array)
{
    free(array.ptr);
}

char *a = new char [ 10 ];

궁금한 건 어떻게 하면 한 글자의 길이를 얻을 수 있을까?

그것은 매우 간단하다.:) 1개의 스테이트먼트만 추가하면 됩니다.

size_t N = 10;
char *a = new char[N];

이제 할당된 어레이의 크기를 가져올 수 있습니다.

std::cout << "The size is " << N << std::endl;

여기서 많은 것이 C 표준 함수 std:: strlen에 언급되었다.그러나 문자 배열의 실제 크기는 반환되지 않습니다.저장된 문자열 리터럴 크기만 반환합니다.

차이점은 다음과 같습니다.코드 스니펫을 예로 들면

char a[] = "aaaaa";
int length = sizeof(a)/sizeof(char); // length=6

그러면 std::stren()은 코드와 같이 6이 아닌5를 반환합니다.

해야 할 하십시오.문자 배열을 동적으로 할당해야 하는 경우 클래스 사용을 고려하십시오.std::stringmeth of size와 그 동의어 길이를 가지고 있어 언제든지 어레이 크기를 가져올 수 있습니다.

예를들면

std::string s( "aaaaa" );

std::cout << s.length() << std::endl;

또는

std::string s;
s.resize( 10 );

std::cout << s.length() << std::endl;

Strlen 명령어가 작동합니다. 다음 코드를 시도해 보십시오.

// 문자 *s

unsigned int  strLength=strlen(s);

이블 '이블™'에 될 때 의 모든 을 '이블™'로 것은 요?'\0' 후 를 사용합니다.strlen()이렇게 하면 처음에 계산을 멈추기 때문에 소위 말하는 진정한 가치를 얻을 수 있습니다.'\0'주칩니니다다

그런데 지금 생각해 보니, 제발 Ever™는 이러지 말아주세요.더러운 기억 더미에 착륙하고 싶지 않다면 말이야

또한 할당된 메모리 또는 총 메모리에 대해 환경에서 제공되는 경우 다음 함수를 사용할 수 있습니다.

char* 문자열의 길이는 다음과 같습니다.

char* mystring = "Hello World";
int length = sprintf(mystring, "%s", mystring);

sprintf()는 mystring을 인쇄하고 인쇄된 문자 수를 반환합니다.

다음과 같이 시도해 볼 수 있습니다.

int lengthChar(const char* chararray) {
   int n = 0;
   while(chararray[n] != '\0')
     n ++;
   return n;  
}

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 해서 를 잘 new[] 보다 좋은 것은, 을 사용하는 입니다.std::vector둘 다 길이를 추적하고, 다 쓰면 메모리를 풀 수 있습니다.

주의: 이 답변은 C가 아닌 C++만을 대상으로 합니다.

인 자자 your your 를 구현할 수 .new ★★★★★★★★★★★★★★★★★」deleteget-size★★★★

#define CEIL_DIV(x,y) (((x)-1)/(y)+1)

void* my_new(int size)
{
    if (size > 0)
    {
        int* ptr = new int[1+CEIL_DIV(size,sizeof(int))];
        if (ptr)
        {
            ptr[0] = size;
            return ptr+1;
        }
    }
    return 0;
}

void my_delete(void* mem)
{
    int* ptr = (int*)mem-1;
    delete ptr;
}

int my_size(void* mem)
{
    int* ptr = (int*)mem-1;
    return ptr[0];
}

이 경우, 이 값을 수 .new ★★★★★★★★★★★★★★★★★」delete같은 방법으로 연산자를 사용합니다.

을 사용법 예를 들어 문자열 끝에 "%"라고 하는 특수 문자를 추가한 후 해당 문자가 표시되는지 확인할 수 있습니다.
이것은 그 수 때문입니다.그 캐릭터는 다른 장소에서도 char*에 포함될 수 있습니다.

char* stringVar = new char[4] ; 
stringVar[0] = 'H' ; 
stringVar[1] = 'E' ; 
stringVar[2] = '$' ; // back-tracker character.
int i = 0 ;
while(1)
{
   if (stringVar[i] == '$')
     break ; 
   i++ ; 
}
//  i is the length of the string.
// you need to make sure, that there is no other $ in the char* 

그렇지 않으면 길이를 추적하고 메모리를 할당하는 사용자 지정 구조를 정의합니다.

new가 어레이를 할당하는 경우 컴파일러에 따라 (나는 gnu c++를 사용) 어레이 앞에 있는 단어는 할당된 바이트 수에 대한 정보를 포함합니다.

테스트 코드:

#include <stdio.h>
#include <stdlib.h>

int
main ()
{
    int arraySz;
    char *a;
    unsigned int *q;

    for (arraySz = 5; arraySz <= 64; arraySz++) {

        printf ("%02d - ", arraySz);

        a = new char[arraySz];
        unsigned char *p = (unsigned char *) a;

        q = (unsigned int *) (a - 4);
        printf ("%02d\n", (*q));

        delete[] (a);

    }
}

내 머신의 덤프아웃:

05 - 19
06 - 19
07 - 19
08 - 19
09 - 19
10 - 19
11 - 19
12 - 19
13 - 27
14 - 27
15 - 27
16 - 27
17 - 27
18 - 27
19 - 27
20 - 27
21 - 35
22 - 35
23 - 35
24 - 35
25 - 35
26 - 35
27 - 35
28 - 35
29 - 43
30 - 43
31 - 43
32 - 43
33 - 43
34 - 43
35 - 43
36 - 43
37 - 51
38 - 51
39 - 51
40 - 51
41 - 51
42 - 51
43 - 51
44 - 51
45 - 59
46 - 59
47 - 59
48 - 59
49 - 59
50 - 59
51 - 59
52 - 59
53 - 67
54 - 67
55 - 67
56 - 67
57 - 67
58 - 67
59 - 67
60 - 67
61 - 75
62 - 75
63 - 75
64 - 75

이 솔루션은 권장하지 않습니다(벡터가 더 좋습니다). 하지만 정말로 절박한 경우에는 관계를 찾아 힙에서 할당된 바이트 수를 결정할 수 있습니다.

정당한 질문입니다.저는 개인적으로 문자 포인터(char*)의 결과로서 포인터와 배열이 혼동된다고 생각합니다.이것문자 어레이(char_[X])와 거의 같은 목적으로 기능합니다.즉, 포인터와 어레이는 동일하지 않기 때문에 포인터는 특정 크기를 포함하지 않고 주소만 포함할 수 있습니다.그래도 strlen과 비슷한 것을 시도해 볼 수 있습니다.

int ssize(const char* s)
{
    for (int i = 0; ; i++)
        if (s[i] == 0)
            return i;

    return 0;
}

언급URL : https://stackoverflow.com/questions/21022644/how-to-get-the-real-and-total-length-of-char-char-array

반응형