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::string
meth 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
★★★★★★★★★★★★★★★★★」delete
및 get-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
'programing' 카테고리의 다른 글
GSON - 날짜 형식 (0) | 2022.08.16 |
---|---|
유닛 테스트 작성 방법 (0) | 2022.08.16 |
Java에서 int에서 Long으로 변환하려면 어떻게 해야 하나요? (0) | 2022.08.12 |
구문 오류:Browserify에서 예기치 않은 토큰... (82:8) (0) | 2022.08.12 |
등록된 모듈의 vuex 알 수 없는 변환 유형 (0) | 2022.08.12 |