2014-01-25 2 views
3

Stdin에서 입력 스트림의 길이를 결정하는 가장 좋은 방법은 올바른 길이의 배열을 만들 수 있습니다. 예를 들어 getchar()?입력을 저장하는 데 필요한 배열 길이 결정

while((ch = readchar()) != "\n") { 
    count++; 
} 

다음 계수의 크기와 배열을 생성 :

입력 스트림의 모든 문자에 엿과 같은 것을 사용하는 몇 가지 방법이 있나요?

+0

명령 줄에서 전달할 수 있습니까? –

+1

일반적인 방법은 배열을 동적으로 확장하여 배열을 읽고 채우는 것입니다. 이는 (a) 입력을 두 번 읽는 것보다 빠르고, (b) 입력 스트림을 찾을 수없는 경우 유일한 방법입니다. (모든 스트림에 대해 작동하는 코드는 검색 가능한 스트림에서만 작동하는 코드보다 재사용이 가능합니다.) – Nemo

+1

그래,하지만 단락이나 다른 문자의 문자 수를 정확하게 계산하기를 원하지 않는다고 가정 해 봅시다. . – a3onstorm

답변

4

코드를 입력하는 동안 몇 가지 유사한 답변이 있습니다.

int size = 1; 
char *input = malloc(size); 
int count = 0; 
while((ch = getchar()) != '\n') { 
    input[count++] = ch; 
    if (count >= size) { 
     size = size * 2; 
     input = realloc(input, size); 
    } 
} 
input[count++] = 0; 
input = realloc(input, count); 

은 또한 당신이 POSIX 라이브러리 함수 getline()와 동일하게 사용할 수 있습니다 : 당신이 뭔가를 할 필요가 두렵다. 나는.

int count, size; 
char *input = NULL; 
count = getline(&input, &size, stdin); 

두 경우 모두 입력을 완료하면 입력을 무료로 잊지 마세요.

+0

+1. 물론 프로덕션 구현에서는'malloc' 및'realloc'에 대한 모든 호출이 NULL인지 확인하기 위해 반환을 확인해야합니다. 또한이 구현은 입력에 NULL 문자를 허용하므로 결과를 안정적으로 해석하는 것이 어렵습니다. – Nemo

+0

고마워요! 나는 C를 시작하기 때문에 모든 포인터를 제대로 배워야합니다. 빠른 질문 : 왜 여분의 0을 추가해야합니까?왜 그냥'input = realloc (input, count)'을 루프 뒤에서 똑바로 할 수 없습니까? – a3onstorm

+0

정말 필요하지 않습니다. 그러나 두 가지 효과가 있습니다. 모든 문자열 관련 함수를'input'에 사용할 수 있으며, 마지막 줄에 count! = 0이 있어야합니다. – Marian

0

일반적으로 방법이 없습니다. 앞의 한 문자 만 들여다 볼 수 있으므로, 예에서와 같이 코드를 사용하면 문자가 이미 읽혀지고 카운트를 알고 메모리를 할당 할 수는 있어도 다시 읽을 수는 없습니다. 가능한 전략은 처음에 일부 메모리를 할당 한 다음 제한을 두드리는 경우 루프에서 길이를 두 배로 늘리면서 메모리를 재 할당하는 것입니다.

0

일반적인 유닉스 파일에서이 작업을 수행하는 한 가지 방법은 fseek 시스템 호출을 사용하여 파일 크기를 결정하는 것입니다. 죄송하지만 STDIN은 검색 가능한 스트림이 아닙니다.

내가 알고있는 일반적인 경우를 처리하는 유일한 방법은 단순히 동적 메모리 할당을 사용하는 것입니다. 초기 버퍼로 가장 잘 추측 할 수 있습니다. 끝까지 도달하면 malloc 새 배열을 다시 시작합니다. 이 프로세스를 처리하는 실수는 많은 고전적인 보안 버그의 시작입니다.

관련 문제