2012-11-15 3 views
0

포인터를 사용하여 문자열 변수를 만들 수 있습니까? 그래서 char x [4] = "aaa"처럼 매번 크기를 넘을 필요가 없습니까?ANSI C - 문자열 포인터의 크기를 계산하십시오.

어떻게 이러한 문자열의 크기를 얻을 수 있습니까?

포인터로 빈 문자열을 초기화 할 수 있습니까?

+0

조금 더 설명해 주시겠습니까? – mathematician1975

+0

"크기를 전달하십시오"라고 말하면 함수 매개 변수로 가정합니까? – WhozCraig

+0

2 개의 맥주 + 많은 잘라 붙이기, 롤, 죄송합니다, 이미 편집 : P – user1615069

답변

8

C의 문자열은 널 종료 자 문자 (\0)로 끝납니다. 당신의 변수가 예 (초기화하거나 잘 형성되지 않은 경우 NULL를 됨으로써,

char *x = "hello"; // automatically appends a null terminator 
int len = 0; 
while (x[len] != '\0') { 
    len++; 
} 

을 : 당신이 당신의 포인터 변수에 저장된 잘 구성된 문자열이있는 경우, 따라서이 문자를 검색하여 길이를 확인할 수 있습니다) 당신은 분명히이 접근법을 취할 수 없다; 그러나 대부분의 함수는 일반적으로 문자열 이라는 가정하에 작성됩니다. 그 이유는 더 빠른 코드를 생성하기 때문입니다.

포인터를 초기화하려면 NULL, 유효한 주소 (예 : char *x = &someCharVar) 또는 문자열 상수 (예 : char *x = "hello")의 세 가지 옵션이 있습니다. 문자열 상수를 사용하는 경우 상수가 아닌 문자열의 주소로 다시 할당하지 않는 한 은 불투명입니다. char은 항상 정확히 1 바이트로 정의되어 있기 때문에 sizeof(char)가 여기에 불필요하다고

// Get enough space for 24 characters plus null terminator 
char *myString = (char*) malloc(25 * sizeof(char)); 
strcpy(myString, "some text"); // fill the new memory 
fgets(myString, 25, stdin); // fill with keyboard input 

참고. 그러나 다른 데이터 유형을 사용하는 경우에는 습관을 유지하는 것이 좋으며, 의도를 명확하게하여 코드 자체를 문서화하는 데 도움이됩니다.

char str[] = "This is a test"; 

이 (char의 15 요소의 배열로 크기를 str을 만들 것입니다 : 당신은 문자열 리터럴과 char의 배열을 초기화하는 경우

+0

malloc과 같은 초기화 예제를 제공해 주시겠습니까? – user1615069

+0

@ user1615069 예제를 업데이트했습니다. –

+0

+1을 더하는 것이 더 좋습니다 : const char * x = "hello"; 그래서 당신은 역 참조 된 x를 할당 할 수 없습니다. –

1

, 당신은 크기를 지정할 필요가 없습니다 initiliazer의 길이 (0 터미네이터 포함)에서 가져온 문자열 리터럴의 내용을 복사합니다. 리터럴

문자열 유형 'char의 N 소자 어레이 "(const char C++에서)의 배열 식이다. 위와 같이 선언에서 배열을 초기화하는 데 사용되거나 연산자 sizeof 또는 단항 & 연산자 인 경우를 제외하고 유형 "T"의 표현식은 "포인터 유형"의 표현식으로 변환됩니다 T "이고 표현식의 값은 배열의 첫 번째 요소의 주소가됩니다.

당신이 작성하는 경우

const char *str = "This is a test"; 

표현을 "포인터 char에"유형 "char의 15 요소의 배열"에서 변환됩니다 "이것은 테스트입니다"하고, 식의 값은 주소입니다 변수 str에 기록됩니다.

문자열 리터럴의 내용을 수정하는 동작은 정의되지 않음 입니다. 정의되지 않음; 일부 플랫폼에서는 문자열 리터럴을 읽기 전용 메모리에 저장하지만 일부 플랫폼에서는 그렇지 않습니다. 어떤 것은 같은 문자열 리터럴을 여러 번 하나의 인스턴스에 매핑하고 다른 인스턴스는 매핑하지 않습니다. 항상 문자열 리터럴을 수정할 수없는 것으로 처리하는 것이 가장 좋습니다. 따라서 strchar * 대신 const char *으로 선언했습니다.

문자열의 길이를 얻으려면, strlen 사용

char str[] = "This is a test"; // or const char *str = "This is a test"; 
size_t len = strlen(str);  // or strlen("This is a test"); 

이 0 터미네이터 (그러나 포함하지 않음)까지 문자열의 문자 수를 반환합니다; 이 당신에게 버퍼 경우의 크기를 제공하지 않습니다

char str[] = "This is a test"; 
size_t len = sizeof str;  // or sizeof "This is a test" 

참고 : strlen("This is a test") 문자열을 포함하는 버퍼의 크기를 얻으려면 14

를 반환합니다, 당신은 sizeof 연산자를 사용합니다 당신은이 경우

const char *str = "This is a test"; 

로, sizeof str; 만, 당신은 POI하지 문자열을 char *의 크기를 제공, 포인터로 str 선언 nts.