포인터가 가리키는 문자열 크기 찾기
#include <stdio.h>
int main ()
{
char *ptr = "stackoverflow"
}
ptr의 크기가 항상 4를 주는데 ptr이 가리키는 스택 오버플로우의 길이를 찾을 수 있는 방법이 있습니까?
strlen을 사용하여 문자열의 길이(문자 수)를 찾습니다.
const char *ptr = "stackoverflow";
size_t length = strlen(ptr);
또 하나의 사소한 점, 주목할 점은ptr
는 문자열 리터럴(수정할 수 없는 const memory에 대한 포인터)입니다.이것을 보여주는 것을 상수로 선언하는 것이 더 좋은 연습입니다.
sizeof()
유형에 필요한 크기를 반환합니다.이 경우 크기로 전달하는 유형은 포인터이므로 포인터의 크기를 반환합니다.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
'programing' 카테고리의 다른 글
MS SQL의 TRIGER_NESTLEVEL()과 동등한 MySQL? (0) | 2023.10.12 |
---|---|
mysql에서 테이블 모음의 마지막 업데이트 시간을 결정하는 효율적이고 신뢰할 수 있는 방법이 있습니까? (0) | 2023.10.12 |
mysql의 하위 쿼리 구분 기호 (0) | 2023.10.12 |
응답 내용은 psql로 이동한 후 주어진 __toString(), "boolean"을 구현하는 문자열 또는 개체여야 합니다. (0) | 2023.10.12 |
mariadb 설치 문제 - ERROR 1524 (HY000):'caching_sha2_password' 플러그인이 로드되지 않았습니다. (0) | 2023.10.12 |