2016-11-04 1 views
0

사용자가 입력 한 문자열을 읽고 파일에 쓰고 싶습니다. 지금 내가C - 사용자 입력을 동적 문자 배열에 저장 하시겠습니까?

char name[25]; 
scanf("%s", name); 
int handle = open("./visitors.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); 
if (handle < 0){ 
    printf("File error.\n"); 
    return; 
} 
lseek(handle, -sizeof(name), SEEK_END); 
write(handle, name, sizeof(name)); 

하고 있어요 물론 사용자가 25 자, 만 이하, 기록하지 않는 대부분의 시간 이후, 옳지 않아의 사용자 입력 5 자이 그렇게 할 때, 다른 (20)는 것이다 비어 있고, 나는 사용자가 입력 한 5 개의 문자와 20 개의 문자가 내 출력 파일에 횡설수설하는 결과를 낳는다. 파일에 사용자 입력 만 기록되도록하려면 어떻게해야합니까?

+0

'scanf'매뉴얼을 읽으셨습니까? '% s'은 출력이 널 종료되도록합니다. –

+0

'-sizeof (name)'은'- (off_t) sizeof (name)'이어야합니다. –

+0

@ M.M 차이는 없습니다. –

답변

1

원시 시스템 호출을 사용하여 파일 작업을 처리하고 있습니다. 귀하의 의도가 구체적으로 시스템 호출에 대해 배우지 않는 한, 그렇게해서는 안됩니다. The write call은 세 번째 매개 변수로 지정된 바이트 수를 씁니다. 이 경우 sizeof(name)이 잘못되었습니다. 이 아닌 문자열의 길이를 반환하면 전체 버퍼의 길이가 반환됩니다.

표준 strlen function은 문자열 길이를 제공합니다. 따라서 strlen(name)을 실행하면 sizeof과 달리 사용자가 5자를 입력하면 5가 표시됩니다.

시스템 호출에 대해 자세히 배우고 싶지 않다면 fprintf을 사용하여 파일로 출력하고 fopenfclose과 같은 함수를 사용하여 C 표준 라이브러리로 파일 작업을 처리해야합니다. 다른 기능에 링크 된 at the fprintf docs을보십시오.

+0

그게 다야! 'sizeof() '대신'strlen()'을 사용하여 그것을 고쳤습니다. 고맙습니다! –

1

저수준 시스템 호출을 사용하려는 이유가 확실하지 않습니다. open, lseek, write. 일반적으로 표준 C fopen, fscanf, fprintf 기능을 사용하는 것이 훨씬 편리합니다.

이 경우 stdin에서 문자열 입력을 얻으려면 fgets을 시도한 다음 을 %s과 함께 사용하여 파일에 쓸 수 있습니다. 버퍼 name[25] 또는 name[100] (여전히 최대 입력은 stdin)을 사용할 수 있습니다. 그냥 NULL로 끝나는 있는지 제대로 초기화하십시오. 그런 다음 fprintf%s과 함께 사용하면 문자열을 제대로 쓸 수 있습니다 (예 : 횡설수설 말미 않음).

+0

버퍼가 널 종료되었는지 어떻게 확인합니까? –

+0

그냥'char name [25] = "" "; – artm

+0

루프에서'name'을 사용해야한다면'memset' 루프의 시작 부분에 모두 0이됩니다. – artm

관련 문제