programing

C에 문자열 타입이 있나요?

goodsources 2022. 8. 15. 21:40
반응형

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 의 배열을 한다.charnull 문자, 즉 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

반응형