2016-10-17 2 views
-1

안녕하세요, C 언어 사용에 대한 나의 오래된 지식을 검토하고 싶습니다. C 문자열에 메모리를 할당하고이 버퍼에 쓰거나이 버퍼에서 C 문자열을 읽으 려합니다. 내가 기억하는 바로는 C- 문자열을 나타 내기 위해 각 문자 배열의 끝에 '\ 0'과 같은 것이있다.C 문자열 할당

항상 문자열을 (STRLEN + 1)로 할당하고 읽고 쓰는 동안 (파일, 소켓 등으로) 똑같이하는 것이 옳습니다.

char *myCString = malloc(sizeof(char)*(STRLEN+1)) 
read(fd, buff, STRLEN+1); 
write(fd, buff, STRLEN+1); 

이 문제를 명확히 해 주셔서 감사합니다.

+0

'\ 0'은 문자열의 끝을 나타내는 NULL 종결 자로 불립니다. –

+0

대답은 어느 정도 "예"입니다. 그러나 여기서 우리는 어떤 "STRLEN"이 무엇인지 알 수 없습니다. 또한 파일 형식에 따라 다릅니다. 문제는 너무 광범위합니다. –

+0

네, 맞습니다.'\\ '로 끝나는 문자 배열을 C에서 문자열이라고 부릅니다. 또한 sizeof (char)는 항상 1이므로 의미가 없습니다. 그리고'myCString'과'buff '는 같지 않지만 어쩌면 그 둘은 관련이없는 것으로 생각됩니다. – unwind

답변

1

당신은 다소 정확합니다. (는 sizeof (문자)는 1 바이트 경우)이 코드

char *myCString = malloc(sizeof(char)*(STRLEN+1)) 

이에 내 노트는 참으로 STRLEN + 1 바이트의 버퍼를 할당 않습니다. STRLEN은 아마도 예상 한 최대 바이트 수입니다. 컴파일러는 아마도 malloc이 void * 타입을 반환하고 char *에 저장하기 때문에 불평 할 것입니다. malloc 호출에 (char *) 유형 변환을 추가하십시오.

read(fd, buff, STRLEN+1); 

이렇게하면 파일 핸들 fd에서 'buff'라는 버퍼로 최대 (STRLEN + 1) 바이트를 읽습니다. 버퍼 'myCString'을 호출했다는 사실 외에도 Ok입니다. 그러나이 읽기는 파일에서 읽은 문자의 끝에 '\ 0'을 추가하지 않으며 줄 끝에서 멈추지 않습니다.

줄을 읽고 쓰려고한다면 fopen/fclose/fprintf/fputs/fscanf/fgets에 대한 정보를 읽으라고 제안합니다. 이것은 문자열 IO를 파일로 수행하기위한 전통적인 C 라이브러리 함수입니다.

write(fd, buff, STRLEN+1); 

문자열의 길이가 버퍼에 관계없이 파일에 (STRLEN + 1) 바이트를 씁니다.

예를 들어, STRLEN = 7 (8 자 버퍼를 가짐)이라고 가정합니다. 그리고 버퍼에 'HELLO'라는 단어가 있다고 가정 해 봅시다.

메모리가 될 것이다

0 1 2 3 4 5 6 7 
H E L L O \0 ?? ?? 

을 ?? 이 메모리가 어떤 값을 가질 수 있음을 나타냅니다.

'write (fd, buf, 8)'를 수행하면 모든 8 바이트가 파일에 기록됩니다. 파일이 함께 종료됩니다 : 당신은 오히려 파일 (HELLO) 읽기의 예로서

5 바이트를했을 것으로 예상

H E L L O \0 ?? ?? 

, 당신이 그것을 2 선 파일이 있다고 할 수 있습니다 유닉스 파일 엔딩이있다. 그것은 보일 수 있습니다 같은 :

H E L L O \n W O R L D \n 

(\ n은 새로운 라인 문자) 파일에는 \ 0 문자가 없는지

알 수 있습니다. 버퍼 터미네이터로 \ 0은 C이고, 파일에는 아날로그가 없다.마지막에 '\ 0 : 내가 않은 경우

'

H E L L O \n W O 

8 문자를 읽을 수 있으며, 문자열은 더이 없습니다 읽기 (FD, 버피는 8) 다음 내 버퍼로 끝날 것이다 '. 내가 인쇄하려고한다면 \ 0이 없기 때문에 실패 할 것이다.

올바른 기능은 fgets와 fputs로, 문자열을 읽고 쓸 수 있으며 \ n을 고려합니다.