C에서 문자열 정의의 세부 사항은 무엇입니까?


10

수업 중 하나에 대한 숙제 질문에 답변해야합니다. 특히, C의 특정 배열이 문자열로 간주되는지 여부를 말해야합니다. 이 기사 ( https://www.geeksforgeeks.org/strings-in-c-2/ )를 기반으로 문자열은 끝에 null 종결자가있는 문자 배열이라는 것을 알고 있습니다.

내 주요 끊기는 다음과 같은 배열에 대해 묻는 질문의 일부입니다.

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };

이것은 분명히 끝에 종료 문자가있는 문자 배열입니다. 그러나 중간에 null로 끝나는 문자가 있기 때문에 여전히 문자열로 간주됩니까? 그것이 끈에 어떤 영향을 미칩니 까?

편집 : 의견을 바탕으로 질문의 실제 문구를 제공했습니다.

"다음 배열을 strcpy (), strncpy (), strcmp (), strncmp () 및 유사한 문자열 함수에 대한 인수로 사용하기 위해"문자열 "로 간주 할 수있는 것은 무엇입니까?"

편집 : 질문이 모호하게 표현 된 것처럼 (여러 사람이 지적한 것처럼) 교수에게 이메일을 보냈습니다. 누군가 궁금한 점이 있다면 "그렇습니다. 문자열입니다. 열쇠는 널 문자가 있다는 것입니다. 물론 문자열 조작에 영향을 줄 것입니다. 문자열은 널 문자로 끝납니다."


4
"CS"몇 바이트의 가비지가 추가 된 문자열이라고 말할 수 있습니다 (이 경우 최종 NUL 문자는 관련이 없습니다). 그러나 "전체"문자열이 아닙니다. -그럼에도 불구하고이 기능 등을 공급하면 strcpyPC가 폭발하지 않습니다. 이러한 기능은 일부만 "보이기"때문 "CS"입니다.
Hagen von Eitzen

2
c1은에 대한 인수로 절대적 으로 사용될 수 있습니다 strcmp(). 문자열 함수를 변경하는 인수로 사용할 수 있는지 여부는 제공되지 않은 추가 요소에 따라 다릅니다.
EOF

2
의 내용 c1은 변경 가능하므로 strcpy소스 문자열을 수용하기에 충분히 크지 않은 한 왜 유효한 대상 인수가되지 않는지 알 수 없습니다 . 그것은 문자열이 아니며 주어진 목적에 적합한 문자열이 아닙니다.
John Bollinger

1
전반적으로, 나는 그 질문이 모호하게 표현되어 있다는 것에 동의합니다. 이 표현식 c1은 특별히 명명 된 모든 함수를 포함하여 모든 표준 라이브러리 (좁은) 문자열 함수에 대한 문자열 인수에 대한 기본 요구 사항을 충족하지만 호출자가 기대하거나 원하는 것이 아닐 수 있습니다 (심지어 도출 될 수있는 정의되지 않은 동작 무시).
John Bollinger

1
점을 유의 필요가 없습니다 char. 모든 문자 유형 이 가능합니다.
chux-복직 모니카

답변:


8

c1는 [1]과 거의 동일하며 &c1[0]하나의 문자열을 보유하고 "CS"있습니다.

이, 거기에 숨어 두 번째 문자열이다 "324", 시작은 &c1[3]- 그러나만큼 당신이 액세스 할 때 c1와 같은 c1문자열은 "CS"모든 기능이다 strcpy()등. 볼 것이다.


[1] : c1배열이고 &c1[0]포인터입니다.


명령 c1에서 대상 문자열 로 사용하는 것이 적절 strcpy()합니까? 문제는 모호하다-기껏해야.
Andrew Henle

1
물론에 대한 c1인수로 사용할 수 있습니다 strcpy(). 모든 의미에서 완벽하게 일반적인 문자열입니다. 보통의 문자열은 종종 종료 후 남은 쓰레기를 포함합니다. 이 가비지가 프로그램에 하드 코딩되어 있다는 사실은 저자 c1가 문자열이 아닌 방식으로 사용하려고한다는 인상을 주지만 그것은 문제의 일부가 아닙니다.
이 다니엘 크로커

" c1&c1[0]"실수 와 동일합니다 . c1배열입니다. &c1[0]포인터입니다.
chux-복직 모니카

2

C에서 문자열 정의의 세부 사항을 알고 싶다면 소스로 이동하십시오.

C90 표준에서 :

7 도서관

7.1 소개

용어의 7.1.1 정의 문자열은 첫 번째 널 문자를 포함 연속에 의해 종료 문자의 순서와입니다. 문자열의 "포인터"는 초기 (가장 낮은 주소 지정) 문자에 대한 포인터입니다. 문자열의 "길이"는 null 문자 앞에 오는 문자 수이며 "value"는 포함 된 문자 값의 순서입니다.

(나중의 표준에는 관련 변경이 없었습니다.)

따라서 c1"CS"및 "324"라는 두 개의 연속 문자열이 포함되지만 문자열 자체는 아닙니다.

배열을 함수에 전달하면 첫 번째 요소에 대한 포인터로 쇠약하므로 +c1문자열 ( 첫 번째 요소)을 가리 키 므로 문자열에 대한 포인터를 기대하는 모든 함수에 충분합니다. 문자열 "CS \ 0324"를 가리 키지는 않지만 강사 질문에 충분할 것입니다. 모호합니다.


4
이 정의에 의해서도 c1은 분명히 문자열 "CS"라고 주장합니다. 기간. 터미네이터가 관련이없는 이후에 0이 아닌 바이트를 포함 할 수 있다는 사실은 많은 문자열이 수명이 다할 때와 같습니다.
이 다니엘 크로커

+c1문자열로 c1시작 하기 때문에 문자열을 가리 킵니다 . 그것은 어떤 식 으로든 모양이나 형태 c1가 문자열을 만들지 않습니다.
중복 제거기

2
0 바이트로 끝나는 일부 문자를 포함하는 메모리 섹션의 주소입니다. prints ()가 % s로 잘 작동한다면 strlen ()에 전달 된 완벽하게 좋은 수를 제공하고 strcpy ()에 전달되면 작동합니다. 문자열처럼 들립니다.
이 다니엘 크로커


물론이야. 그러나 배열은 확실히 문자열 일 수 있습니다.
이 다니엘 크로커

0

@DevSolar의 대답에 덧붙여 주어진 문자열을 가지고 놀면서 발견 한 것이 있다면 다음과 같습니다.

char c1[] = { 'C', 'S', '\\0', '3', '2', '4', '\\0' };

이 문자열을 출력하면 얻을 수 있으며이 문자열 CS03240의 크기는 7입니다. 이해 \\0하는 한 널 문자 ( \0 ) 를 나타내는 데 사용됩니다 . 당신이 할 경우 :

printf("\0");

출력 로그에 아무 것도 표시되지 않지만 다음과 같은 경우에는

printf("\\0");

\0백 슬래시 또는 따옴표와 같은 특수 문자를 출력하기 때문에 예상되는을 볼 수 \있습니다.

나를 괴롭히는 것은 출력 CS03240이며 크기는 7입니다. 문자열의 크기는 그 안에있는 문자 수에 1을 더한 것 (널 문자의 경우)이라는 것이 일반적으로 이해됩니다. 또한 문자열의 크기는 7 char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };입니다.

아마도이 질문에 대한 후속 조치는 무엇입니까?


1
'\\0'null 문자 가 아닙니다 . 다중 문자 상수입니다. 확실히 범위 밖의 값으로 정의 된 구현이 char있습니다. c1[]아닌 문자열 그것이 부족으로 널 (null) 문자를 . "이 문자열을 출력"하면 정의되지 않은 동작이 발생할 수 있습니다.
chux-복원 Monica Monica

다중 문자 상수를 찾았지만 정확하게 얻지 못했습니다. c1 []이 끝에 널 (null) 문자가 없어서 문자열이 아닌 경우 왜 OP에 의해 게시 된 초기 크기에서 크기가 7로 표시됩니까?
rasengan__

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };7 값으로 초기화되기 때문에 크기는 7입니다. 그것은 크기 와는 아무 상관이없는 문자열을 . char c1[] = { 1, 2, 3, 4, 5, 6, 7 };여전히 크기를 7로 만들 것입니다.
chux-Reinstate Monica

배열 c1에 찌르기 가 포함되어 있습니까? 그것은 별도의 문제입니다. 참고
chux - 분석 재개 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.