C에 문자열 타입이 있나요?
저는 최근에 자바와 파이썬에서 C로 프로그래밍을 시작했습니다.제 책에서 'Hello World' 프로그램을 만들기 위해서는 다음과 같은 구문이 필요합니다.
char message[10]
strcpy(message, "Hello, world!")
printf("%s\n", message);
이 예에서는 char 배열을 사용하고 있습니다.문자열은 어떻게 된 거죠?왜 나는 그것 중 하나를 간단히 사용할 수 없는 거죠?다른 방법이 있지 않을까?
C는 네이티브 문자열 타입을 가지고 있지 않습니다. 그 는 에음음음음음음음음음 of of of of of of of of of of of of of of 의 배열을 한다.char
null 문자, 즉 null 문자, null 문자, null 문자 등으로 .'\0'
언어 표준 라이브러리의 기능 및 매크로는 null로 종단된 문자 배열(예를 들어 스트렌 반복)을 지원합니다.char
마 '\0'
소스 스트링에서 문자 및 strcpy 복사가 발생할 때까지'\0'
.
C에서 null 종단 문자열의 사용은 C가 어셈블리 언어보다 조금 더 높은 수준만을 의도했다는 사실을 반영합니다.제로 종단 문자열은 PDP-10 및 PDP-11 어셈블리 언어로 이미 직접 지원되었습니다.
C 문자열의 이 속성은 심각한 보안 결함을 포함한 많은 심각한 버퍼 오버런 버그로 이어집니다.를 들어, 하는 을 잊은 source는 null입니다.strcpy
을 지나 에 있는 , 「」가 .0
메모리내의 행선지 문자열의 위치에 이은 중요한 정보는, 덮어쓸 가능성이 있습니다.
예에서는 리터럴 "Hello,가 "Hello, world!"의 긴 됩니다.char
첫 쉼표 및 늘 문자 "13", "", "", " " " " 가 됩니다.'\0'
이치노어레이의 마지막 요소에 액세스하면 다음과 같습니다.0
예:
const char foo[] = "Hello, world!";
assert(foo[12] == '!');
assert(foo[13] == '\0');
, 이 에서는, 「 」, 「 。message
열 번 strcpy
는 늘 모두 이 주소는 늘 터미네이터입니다.이거는, 다음의 주소로부터 시작됩니다.message
. 첫message
나머지 4바이트는 단순히 스택의 끝에 쓰여집니다.이러한 4개의 추가 바이트를 스택에 쓰는 경우의 결과는 예측하기 어렵지만(이 단순한 예에서는 아무것도 해치지 않을 수 있습니다), 실제 코드에서는 일반적으로 데이터 파손이나 메모리액세스 위반 에러가 발생합니다.
말씀하신 언어로 메모하려면 다음 절차를 따릅니다.
자바:
String str = new String("Hello");
Python:
str = "Hello"
Java와 Python은 모두 "문자열" 개념을 가지고 있지만 C는 "문자열" 개념을 가지고 있지 않습니다.C에는 "읽기 전용" 또는 조작 가능한 문자 배열이 있습니다.
C:
char * str = "Hello"; // the string "Hello\0" is pointed to by the character pointer
// str. This "string" can not be modified (read only)
또는
char str[] = "Hello"; // the characters: 'H''e''l''l''o''\0' have been copied to the
// array str. You can change them via: str[x] = 't'
NULL 는 sentinel입니다).'\0'
초병.
C는 퍼스트 클래스 문자열 유형을 지원하지 않습니다.
C++에는 std:: 문자열이 있습니다.
거기에는 없다string
입력하다C
. char 어레이를 사용해야 합니다.
덧붙여서, 어레이의 사이즈에 따라 어레이 전체에 0 끝 문자를 추가할 수 있기 때문에, 코드는 동작하지 않습니다.
첫째, 그렇게 다 할 필요는 없어요.특히,strcpy
용장성이 있습니다.문자열을 복사하지 않아도 됩니다.printf
그거. 네.message
이 문자열을 사용하여 정의할 수 있습니다.
둘째, "Hello, World!" 문자열에 충분한 공간이 없습니다.message
는 14자 이상이어야 하며 Null 터미네이터에 추가 문자를 사용할 수 있습니다).
하지만 왜 그런지는 과거지.어셈블러에는 문자열이 없고 바이트, 워드 등이 있습니다.파스칼은 문자열이 있었지만, 그것 때문에 정적 타이핑에 문제가 있었습니다.string[20]
와는 다른 타입이었다.string[40]
초기에도 이 문제를 회피하는 언어가 있었지만, 그 결과 간접 및 동적 할당 오버헤드가 발생하여 효율에 큰 문제가 되었습니다.
C는 단순히 오버헤드를 피하고 매우 낮은 수준을 유지하기로 결정했습니다.문자열은 문자 배열입니다.배열은 첫 번째 항목을 가리키는 포인터와 매우 밀접하게 관련되어 있습니다.배열 유형이 포인터 유형으로 "decay"되면 정적 유형에서 버퍼 크기 정보가 손실되므로 오래된 Pascal 문자열 문제가 발생하지 않습니다.
C++에는std::string
이러한 많은 문제를 회피하고 동적 할당 오버헤드를 가지고 있는 클래스입니다만, 요즘은, 그러한 것에 신경쓰지 않습니다.그리고 어떤 경우든,std::string
라이브러리 클래스입니다.아래에는 C형 문자 배열 처리가 있습니다.
C에서 문자열은 단순히 문자 배열로, 늘 바이트로 끝납니다.비상대기상태char*
C 코드를 읽을 때 "string"으로 발음되는 경우가 많습니다.
C에는 Java와 같은 자체 String 데이터 유형이 없습니다.
문자 배열 또는 문자 포인터를 사용하여 C에 문자열 데이터형을 선언할 수 있는 것은 다음과 같습니다. 예:
char message[10];
or
char *message;
단, 최소한 다음 사항을 선언해야 합니다.
char message[14];
메시지 변수에 "Hello, world!"를 복사합니다.
- 13 : "Hello, world!"의 길이
- 1 : 문자열의 끝을 식별하는 '\0' null 문자의 경우
언급URL : https://stackoverflow.com/questions/14709323/does-c-have-a-string-type
'programing' 카테고리의 다른 글
Retrofit 2를 사용하여 모든 요청에 머리글 추가 (0) | 2022.08.15 |
---|---|
$router로 데이터를 전달하려면 어떻게 해야 합니까?Vue.js를 밀어넣을까요? (0) | 2022.08.15 |
Apache Camel이 정확히 무엇입니까? (0) | 2022.08.15 |
Vue + Vuex: 형식 입력 데이터 (0) | 2022.08.15 |
가장 좋은 연습 Vuex 모듈 분리하는 것입니다? (0) | 2022.08.15 |