2014-04-04 9 views
3

참고 :

이 순수 C. 없음 C++ 기능에 대한 질문 등이다C 문자열 null 종결


질문 :

가정하자 나는 malloc 버퍼가 100 chars 방. 그런 다음 슬롯 중 5 개만 실제 chars으로 채 웁니다. 나는 가장 좋은 방법은이 같은 버퍼에 남아있는 모든 슬롯을 null로는 것을 들었습니다 :

while (nextAvailableBufferSlot < currentBufferSize) 
{ 
    buffer[nextAvailableBufferSlot] = '\0'; 
    nextAvailableBufferSlot++; 
} 

이가 꼭 필요한가요, 아니면 단순히 buffer[5] = '\0' 자신에게 루프를 저장을 설정할 수 있습니까?


상황 : 문제의 코드가 실행 위의 루프를 만들고, 버퍼 4096의 크기와 훨씬 짧은 복사 될 문자열의 99 %로 매우 자주이라고

거의 최소 2 천 번 반복 할 때마다

문자열이 어떤 크기인지 미리 알 수 없습니다. 그리고 re-allocs 너무 비싸기 때문에, 나는 처음에는 큰 버퍼 크기를 선택합니다. 데스크톱 수준의 하드웨어를 대상으로하므로 메모리가 전혀 제약되지 않습니다.

+0

여기에는 실제로 관련이 없지만 "ANSI C"를 진정으로 의미합니까, 아니면 "C++ 응답을 유지 하시겠습니까?"와 같이 "엄격한 C"를 의미합니까? 후자라면, 내가 생각하기에 태그가 충분합니다. –

+0

그런 최고의 연습에 대해 들어 본 적이 없기 때문에 나는 그것을 최선이라고 부르지 않을 것입니다. 비록 당신이 이것을해야 할지라도 (예를 들어, chars를 순서가 맞지 않는 것에 접근하는 것), memset이 갈 길이 될 것입니다. –

답변

1

복사하는 문자열 인 경우 strncpy을 사용하면 문자열을 복사 할 수 있으며 여분의 버퍼 공간은 \0으로 채워집니다.

모든 표준 문자열 연산 ( strlen, strcpy, 등) 어쨌든 처음 \0에서 멈출 것 때문에 strcpy을 사용하거나 다음 네 손으로 문자열을 복사하는 어떤 이유로, 당신은 자신에게 루프를 저장 할 수 있습니다.

0

짧은 대답은 네가 옳다는 것입니다. 배열의 마지막 문자 바로 다음에 오는 null 포인터 하나만 있으면됩니다.

전형적인 대답은 char 포인터를 사용하지 않는 이유는 무엇입니까? 문자열과 같은 char *가 전체적인 두통을 처리해 주며 더 쉽게 조작 할 수있는 라이브러리가 있습니다. 이런 식으로 직접 메모리를 할당 할 필요는 없습니다. 왜 정확히 100의 필요한 버퍼에 대한 특별한 이유가 있습니까?

+0

감사합니다 - 여기 예제는 단순성을 위해 고안된 것입니다. 실제 프로젝트에서 버퍼 *는 char *입니다.단순히 문자열을 복사하는 것이 아니며 입력을 구문 분석 할 때 문자 단위로 문자열을 구성합니다. – Bryan

+0

"숯불 포인터를 사용하지 않는 이유는 무엇입니까?" 그는 이미'char * '를 사용하고 있는데, 그것은'malloc'이 반환 한 것이다. 그가 문자열 리터럴을 사용할 것을 제안합니까? 그리고 "끈 같은 숯이 당신을 위해 모든 두통을 처리합니까?"라는 의미는 무엇입니까? 문자열 관리는 C의 가장 PITA 측면 중 하나입니다. 수정할 수없는 문자열 리터럴을 사용하지 않는 한 "돌보아주는"것은 없습니다. –

+0

그의 코멘트는 그가하려고하는 것을 정리했습니다. 나는 그가 char *를 만드는 대신에 100 개의 chars 배열을 mallocing한다고 생각했다. 그리고 아니요, 문자열 리터럴을 사용하지 않는 것이 좋습니다. –

0

모든 실제적인 목적을 위해, NUL은 마지막 위치가 채워진 후 첫 번째 위치 만 종료하면됩니다. 모든 기능은 문자열을 조작 할 때 어디에서 중지해야 하는지를 알기 위해 필요한 기능입니다.

0

대신 Calloc() 함수를 사용하십시오. 메모리 블록을 자동으로 0으로 초기화합니다 (NULL 할당은 NULL과 동일한 ASCII 코드이므로 0). 그러면 각 슬롯을 Null에 명시 적으로 할당 할 필요가 없습니다.

+0

네, 저는 콜록을 알고 있습니다. 그러나 그것은 뒤에서 똑같은 일을 할 것이기 때문에 느려집니다. 이 코드가 망치질 때문에 SPEED가 강조됩니다. – Bryan