char 배열을 비우는 방법?


86

char members [255]와 같은 문자 배열이 있습니다. 루프를 사용하지 않고 어떻게 완전히 비울 수 있습니까?

"비어 있음"이란 일부 값이 저장되어 있으면 안된다는 의미입니다. 예를 들어 strcat을 수행하면 이전 값이 유지되지 않아야합니다.


3
"어레이 비우기"란 무엇을 의미합니까?
pmg

4
부재 [0] = 부재 [1] = 부재 [2] = 부재 [3] = ... 부재 [255] = 0이되지 아니 루프)
존 라 Rooy

18
따라서 "배열"은 특별한 종류의 배열 string입니다. 문자열을 "비우려면"첫 번째 요소를 '\ 0'으로 설정하십시오.members[0] = '\0';
pmg

커뮤니티는 memset을 선호하는 것 같습니다. 그러나 이것이 내 요구 사항을 고려할 때 가장 효율적인 방법입니까?
Alex Xander

2
@Alex Xander :이 경우 "커뮤니티"는 분명히 잘못되었습니다. 'memset'(무단 사용을 방지하기 위해 데이터 삭제와 같은)이 필요한 상황이 있지만 간단한 문자열 재설정 (귀하의 경우)의 경우 정답은 첫 번째 요소 만 0으로 설정하는 것입니다.
AnT 2010 년

답변:


173

사용

일반적으로

배열이 범위 내에있는 경우 또는

포인터 값만 있고 nMembers는 배열의 요소 수입니다.


편집 물론 이제 요구 사항은 배열을 지우는 일반적인 작업에서 순전히 문자열을 재설정하는 것으로 변경되었으며 memset과도하고 첫 번째 요소를 0으로 설정하면 충분합니다 (다른 답변에서 언급했듯이).


편집 memset 을 사용하려면 string.h포함 해야합니다 .


6
+1-모든 배열 요소가 알려진 상태에 있는지 확인하기 때문에이 작업을 수행합니다.
ChrisBD

그러나 루프를 사용하지 않는 (서사시적인) 요구 사항에 위배됩니다.
Michael Foukarakis

1
memset은 아마도 재귀로 구현되지 않을 수 있지만 두 경우 모두 반복이 눈에 보이지 않게 숨겨져있어 외관상 요구 사항이었습니다.
Steve Gilham

37

'비어 있음'이 의미하는 바에 따라 다릅니다.


3
이는 members [1]에서 members [254]까지가 아니라 members [0]의 값만 변경합니다. 순차적으로 액세스하는 경우 괜찮지 만 다른 경우에는 그렇게 좋지 않습니다.
Thomas Owens

3
OP 편집 후 strcat ()이 NULL 바이트를 찾아 그에 따라 처리하므로 내 솔루션이 그의 요구 사항에 맞게 작동하는 것 같습니다.
Felix

3
더 나은 해결책은 아닙니다. 다른 문제에 대한 해결책 일뿐입니다.
ypnos

4
C에서 추상 배열을 "비우는"방법은 없습니다. 모든 배열은 0이더라도 무언가를 포함합니다. "배열 비우기"라는 개념은 배열 내용의 상위 수준 논리적 해석에만 적용됩니다. 예를 들어, 배열의 내용은 C- 문자열로 해석 될 수 있습니다. 이 경우 "비어있는"올바른 방법은 첫 번째 요소를 '\ 0'으로 설정하는 것입니다. 정확히 펠릭스가 한 일입니다. OP가 어떤 다른 해석을 염두에두고 있는지 모르겠지만, 더 구체적으로 만들지 않으면 'memset'을 사용한 모든 시도는 의미없는 질문에 대한 무의미한 대답 일뿐입니다.
AnT

1
@tinkertim : 여기에 NULL이 없습니다. 그리고 아니요, 'strcat'은 NULL을 처리하는 방법을 모릅니다. NULL을 전달하면 충돌이 발생합니다.
AnT 2010 년

9

문자열을 다루는 경우 char 배열을 0으로 만들려고하지 마십시오. 다음은 char 문자열로 작업하는 간단한 방법입니다.

복사 (새 문자열 할당) :

연결 (문자열 추가) :

빈 문자열 :

그렇게 간단합니다.


8

문자 멤버 [255] = {0};


1
아니요, 초기화 후 수행해야한다고 지정하지 않았기 때문입니다. 특히 이것은 편집 전의 첫 번째 예에서 이해되었을 수 있으며 배열을 지우는 것도 매우 일반적인 사용 사례이기 때문입니다.
user44556 2010 년

D : P : 나는 그가 당신에게 -1 준 보상으로 당신이 줄
stviper을

5

편집 : 질문에 대한 가장 최근 편집을 감안할 때 null 종료가 없으므로 더 이상 작동하지 않습니다. 배열을 인쇄하려고하면 문자 뒤에 사람이 읽을 수없는 문자가 여러 개 표시됩니다. 그러나 나는이 답변을 후손을위한 커뮤니티 위키로 남겨두고 있습니다.

작동합니다. C 프로그래밍 언어에 따르면 :

배열의 크기가 고정 된 경우 이니셜 라이저의 수는 배열의 구성원 수를 초과 할 수 없습니다. 더 적 으면 나머지 멤버는 0으로 초기화됩니다.

이것은 배열의 모든 요소가 0의 값을 갖는다는 것을 의미합니다. 0이 유효한 값이기 때문에 이것이 "비어있다"고 생각하는지 아닌지 확실하지 않습니다 char.


"비어 있음"을 정의하는 방법에 따라 다릅니다. 값이 0 인 문자는 사람이 읽을 수있는 문자가 아니며 문자 배열은 알려진 상태에 있습니다. 나는 그것이 비어 있다고 생각할 것입니다. 또한 memset과 똑같은 작업을 수행합니다 (memset에 대한 기억이 맞다면 C를 사용한 지 너무 오래되었습니다).
Thomas Owens

3

배열은 비울 수 없으며 항상 동일한 양의 데이터를 포함합니다.

더 큰 맥락에서 배열의 데이터는 빈 항목 목록을 나타낼 수 있지만 배열에 추가하여 정의해야합니다. 이를 수행하는 가장 일반적인 방법은 유효한 항목의 개수를 유지하거나 (pmg의 답변 참조) 문자열이 0 문자로 종료되도록하는 것입니다 (Felix의 답변). 더 복잡한 방법도 있습니다. 예를 들어 링 버퍼는 데이터가 추가되고 제거되는 위치에 대해 두 개의 인덱스를 사용합니다.


3

귀하의 요구 사항을 고려할 때 충분합니다.

그러나 이것이 버퍼를 "비우는"것은 아닙니다. 메모리는 여전히 할당되고 유효한 문자 값이 여전히 존재할 수 있습니다.


1
* members = 0으로도 쓸 수 있습니다.
eyalm

짝수 0는 유효한 문자입니다. membersC 문자열로 취급 되는지 여부 는 알 수 없습니다.
Sany


2

나는 함께 갈 것이다


OP가 C 배열의 일부가 아닌 작업 (비우기)을 요청하기 때문에 실제로 많은 의미가 있습니다. 따라서 이상적으로는 새로운 데이터 구조를 구현하고 구조를 신호하는 pmg의 방법이 비어 있습니다. 충분합니다.
Michael Foukarakis

아니, 정말 말이 안 돼.

Kinopiko : 분명히 당신은 그때 접근 방식을 이해하지 못합니다
Christian

Kinopiko : 코멘트에서 설명 할 수있는 것보다 내 추론을 더 잘 설명하는 starblue 답변 읽기 (감사합니다 starblue)
pmg

흠, 이것은 흥미로운 접근 방식입니다. members_in_use는 여전히 배열일까요? 나중에 할 수 있습니까? member_in_use [5] = 값? memset (members_in_use, 0, 255); 스티브가 말했듯이? 그렇다면 왜 다른 대신 하나를 사용합니까?

1

0으로 재설정하는 것을 의미하는 경우 "배열을 비우십시오"는 bzero를 사용할 수 있습니다.

배열을 다른 기본 문자로 채우려면 memset 함수를 사용할 수 있습니다.


bzero와 memset (일반적으로) 모두 루프를 사용합니다.
Michael Foukarakis

1

간단할수록 좋습니다.

이 경우 members [0] = 0 만 작동합니다. 간단한 질문을 그렇게 복잡하게 만들지 마십시오.


0

면책 조항 : 저는 일반적으로 C로 프로그래밍하지 않으므로 예제에 구문 문제가있을 수 있지만 표현하려는 아이디어가 명확하기를 바랍니다.

"비어 있음"이 "빈 문자열 포함"을 의미하는 경우 첫 번째 배열 항목을 0으로 할당하면 배열에 임시 문자열이 포함되도록 효과적으로 만들 수 있습니다.

"비우기"가 "사용중인 메모리 해제"를 의미하는 경우 처음에 고정 문자 배열을 사용해서는 안됩니다. 오히려 char에 대한 포인터를 정의한 다음 적절하게 malloc / free (또는 문자열 할당)를 수행해야합니다.

정적 문자열 만 사용하는 예 :


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.