2014-01-14 4 views
0

C 입문 플러스 5 판을 읽고 I/O 장에 있습니다. 몇 가지 일을하는 예제 (451 페이지)를 생각해 내고 어떤 시점에서 기존 파일 다음에 .red 결말이 붙은 새 파일을 만듭니다. 예를 들어이 파일이 "test"이면 프로그램은 "test.red"를 만듭니다. 나는 다음을 이해할 수 없다.다른 파일과 같은 이름의 파일 이름을 지정하십시오.

char name[LEN]; 
//some code... 

strncpy(name,argv[1], LEN - 5); 
name[LEN - 5] = '\0'; 
strcat(name,".red"); 

나는 명령 strcpy의 정의를 보았다. arv [1] (소스 파일이 들어있는)의 첫 번째 LEN-5 문자를 이름에 복사합니다. strcat 명령은 .red를 끝에 추가합니다. 그러나, 나는이 name[LEN - 5] = '\0';의 존재를 이해할 수 없다. 나는 그것을 제거하고 프로그램은 여전히 ​​잘 작동한다.
편집
내가

출력 파일의 새 이름을 구성하기 ...이 라인이 책에서 코멘트를 게시, 프로그램은 배열 이름에 이름을 소용돌이 복사 를 strncpy()를 사용합니다. LEN - 5 인수는 .red 접미사와 최종 null 문자를위한 공간을 남겨 둡니다. argv [2] 문자열이 LEN- 5보다 길면 널 문자가 복사되지 않으므로 프로그램이 null 문자를 추가합니다. strncpy() 호출 후 첫 번째 null 문자의 문자는 마침표로 덮어 씁니다. strcat() 함수가 해당 문자열을 추가 할 때 이 경우에는 eddy.red입니다.

답변

1

문자열은 문자 배열입니다. 문자열이 끝나는 곳을 알기 위해 '\ 0'문자 (문자 코드가 0 인 문자, ASCII 문자로 NUL 문자라고 함)가 마지막 문자 다음에 추가됩니다.

strncpy는 최대 세 번째 인수로 주어진 문자 수를 복사하며 사본이 NUL 종료됨을 보장하지 않습니다. 위로 strncpy가 설계되었을 때, 스토리지는 오늘날보다 제한적이었고, 심지어 단일 바이트조차도 중요했습니다. 14 개 문자가 특정 문자열에 대한 최대 값이라는 것을 알았다면, 종료 문자 NUL없이 14 문자 문자열을 저장할 수있었습니다.

strncpy로 작업 할 때 문자열 복사가 strcat와 같은 다른 C 함수에서 사용될 경우 strncpy가 복사하지 않은 경우 누락 된 NUL 문자를 추가해야합니다.

처음부터 그 자리에 NUL 문자가있는 경우 어쨌든 작동 할 수도 있지만, 이는 사용자가 의존하는 것이 아니거나 컴파일러가 도움을 줄 수는 없습니다.

+0

알기! 고맙습니다! – yaylitzis

관련 문제