code

끝에 null로 끝나는 char(\0)가 없는 문자열 정의

starcafe 2023. 9. 25. 22:52
반응형

끝에 null로 끝나는 char(\0)가 없는 문자열 정의

C/C++에서 끝에 null ending char(\0)가 없는 문자열을 정의하는 다양한 방법은 무엇입니까?

편집: STL 문자열이 아닌 문자 배열에만 관심이 있습니다.

일반적으로 다른 포스터가 쓴 것처럼:

char s[6] = {'s', 't', 'r', 'i', 'n', 'g'};

또는 현재 Charset이 ASCII인 경우, 이는 일반적으로 참(오늘날에는 EBCDIC가 많지 않음)

char s[6] = {115, 116, 114, 105, 110, 107};

C(C++가 아닌)에서만 작동하는 크게 무시된 방식도 있습니다.

char s[6] = "string";

배열 크기가 너무 작아 마지막 0을 유지할 수 없는 경우(그러나 일정한 문자열의 다른 모든 문자를 유지할 수 있는 크기), 마지막 0은 복사되지 않지만 여전히 유효한 C(그러나 유효하지 않은 C++)입니다.

물론 실행 시간에도 실행할 수 있습니다.

char s[6];
s[0] = 's';
s[1] = 't';
s[2] = 'r';
s[3] = 'i';
s[4] = 'n';
s[5] = 'g';

또는 (위와 동일한 ASCII 문자 집합에서 언급)

char s[6];
s[0] = 115;
s[1] = 116;
s[2] = 114;
s[3] = 105;
s[4] = 110;
s[5] = 103;

또는 memcopy(또는 memmove, bcopy)를 사용하지만 이 경우에는 아무런 이점이 없습니다.

memcpy(c, "string", 6);

또는 strncpy

strncpy(c, "string", 6);

이해해야 할 것은 C에는 문자열과 같은 것이 없다는 것입니다(C++에는 문자열 객체가 있지만, 그것은 완전히 다른 이야기입니다).그래서 문자열이라고 하는 것은 단지 문자 배열일 뿐입니다.그리고 심지어 char라는 이름조차도 오해의 소지가 있습니다. char가 아니라 숫자의 일종일 뿐입니다.우리는 그것을 대신 바이트라고 부를 수 있었을 것입니다. 그러나 옛날에는 9비트 레지스터 같은 것을 사용하는 주변에 이상한 하드웨어가 있었고 바이트는 8비트를 의미합니다.

문자 코드를 저장하기 위해 char가 매우 자주 사용될 것이기 때문에, c 디자이너들은 char에 숫자를 저장하는 것보다 더 간단한 방법을 생각했습니다.간단한 따옴표 사이에 글자를 넣으면 컴파일러가 이 문자 코드를 문자에 저장해야 한다는 것을 이해할 수 있습니다.

내 말은 (예를 들어) 당신이 할 필요가 없다는 것입니다.

char c = '\0';

코드 0을 차에 저장하려면 다음 작업을 수행합니다.

char c = 0;

우리는 종종 가변 길이의 여러 문자로 작업해야 하기 때문에, C 설계자들은 또한 "끈"을 위한 컨벤션을 선택했습니다.텍스트가 끝나야 할 곳에 코드 0을 입력하기만 하면 됩니다.그런데 이런 종류의 문자열 표현 "영점 종결 문자열"의 이름이 있는데 변수 이름의 맨 앞에 sz라는 두 글자가 있으면 보통 내용이 영점 종결 문자열임을 의미합니다.

"Cz strings"는 전혀 타입이 아니며, int의 배열처럼 일반적인 문자 배열일 뿐이지만 문자열 조작 기능(strcmp, strcpy, strcat, printf 등)은 0 종료 규칙을 이해하고 사용합니다.이는 또한 0이 아닌 문자 배열이 있는 경우 잘못된 작업을 수행할 가능성이 있으므로 이러한 함수를 호출하지 않아야 함을 의미합니다(또는 strncpy와 같이 이름에 문자가 포함된 함수를 사용해야 함을 의미합니다.

이 협약의 가장 큰 문제점은 비효율적인 경우가 많다는 것입니다.하나의 전형적인 예: 0의 종료된 문자열 끝에 무엇인가를 넣으려고 합니다.만약 당신이 sz 컨벤션으로 문자열 끝에서 점프할 수 있는 사이즈를 유지했다면, 당신은 그것을 문자로 확인해야 합니다.인코딩된 유니코드 등을 다룰 때는 다른 종류의 문제가 발생합니다.하지만 C가 만들어졌을 때 이 협약은 매우 단순했고 완벽하게 수행했습니다.

과 같은 "string" ,const char *는 안 되는 해야 함), 시데이 되므로 즉 포인터가 가리키는 것은 수정해서는 안 되는 상수이며(수정하려면 먼저 수정해야 함), 컴파일 시 많은 프로그래밍 오류를 탐지하는 데 도움이 되므로 좋은 점입니다.

종료 null은 문자열을 종료하기 위해 존재합니다.그것이 없으면 길이를 결정하기 위한 다른 방법이 필요합니다.

미리 정의된 길이를 사용할 수 있습니다.

char s[6] = {'s','t','r','i','n','g'};

파스칼 스타일의 문자열을 에뮬레이트할 수 있습니다.

unsigned char s[7] = {6, 's','t','r','i','n','g'};

사용가능 std::string (C++). (std::string에 관심이 없으므로).

를 처리하거나 ) 을 사용하는 것이 .wchar.h).

그리고 댓글 하나:실제 컴퓨터에서 실행할 수 있는 프로그램에 입력하는 경우에는 자신의 "스트링"을 디핑하는 것을 고려해 볼 수 있습니다.이것은 만약 당신이 실수로 C 스타일 문자열을 기대하는 함수에 전달하려고 한다면 당신의 컴파일러가 barf를 하도록 격려할 것입니다.

typedef struct {
    char[10] characters;
} ThisIsNotACString;

C++std::strings는 NUL이 종료되지 않습니다.

추신:NULL매크로입니다1.NUL이다.\0을 섞지 그것들을 섞지 마세요.

1: C.2.2.3 매크로 NULL

NULL됩니다에 된 매크로입니다.<clocale>,<cstddef>,<cstdio>,<cstdlib>,<cstring>,<ctime>, 아니면<cwchar>는 이 ( (18.1) 의 C++ 입니다에서 널 입니다.

C++에서는 문자열 클래스를 사용하고 null char를 전혀 다루지 않을 수 있습니다.

단지 완성을 위해서 그리고 이것을 완전히 고정시키기 위해서입니다.

vector<char>

std:: 문자열을 사용합니다.

문자열을 저장하는 방법은 수십 가지가 있지만 라이브러리를 사용하는 것이 자신의 문자열을 만드는 것보다 더 나은 경우가 많습니다.저는 우리 모두가 널 터미네이터 없이 문자열을 수행할 수 있는 이상한 방법을 많이 생각해 낼 수 있다고 확신합니다 :).

C에서는 일반적으로 더 쉬운 해결책이 없을 것입니다.파스칼이 한 일을 할 수도 있고 문자열 길이를 첫 글자에 넣을 수도 있지만 이것은 약간의 고통이며 문자열 길이를 첫 글자의 공간에 들어갈 수 있는 정수의 크기로 제한할 것입니다.C++에서는 다음과 같은 std:::string 클래스를 사용할 수 있습니다.

#include <string>

일반적으로 사용되는 라이브러리이기 때문에 이것은 자신의 문자열 클래스를 굴리는 것보다 확실히 더 신뢰할 수 있을 것입니다.

NULL 종료의 이유는 문자열의 핸들러가 문자열의 길이를 결정할 수 있기 때문입니다.NULL 종단을 사용하지 않는 경우 별도의 매개 변수/변수를 통해 문자열 길이를 전달하거나 문자열의 일부로 전달해야 합니다.그렇지 않으면 문자열 자체 내에서 사용되지 않는 한 다른 delimeter를 사용할 수 있습니다.

솔직히 당신의 질문을 잘 이해하지 못합니다, 아니면 정말 질문인지.

stringclass는 null합니다와 합니다.어떤 이유로 문자열 끝에 null 문자를 메모리에 저장하지 않으려면 수동으로 문자 블록을 만들고 직접 작성해야 합니다.

나는 개인적으로 왜 당신이 이것을 하려고 하는지에 대한 현실적인 시나리오를 생각할 수 없습니다. 왜냐하면 널 문자는 문자열의 끝을 알리는 것이기 때문입니다.문자열의 길이도 저장하고 있다면 변수의 크기가 무엇이든(4바이트 정도) 비용으로 1바이트를 절약하고 해당 문자열의 길이에 더 빠르게 액세스할 수 있게 된 것입니다.

언급URL : https://stackoverflow.com/questions/3828307/defining-a-string-with-no-null-terminating-char-0-at-the-end

반응형