Stdin
에서 입력 스트림의 길이를 결정하는 가장 좋은 방법은 올바른 길이의 배열을 만들 수 있습니다. 예를 들어 getchar()
?입력을 저장하는 데 필요한 배열 길이 결정
while((ch = readchar()) != "\n") {
count++;
}
다음 계수의 크기와 배열을 생성 :
입력 스트림의 모든 문자에 엿과 같은 것을 사용하는 몇 가지 방법이 있나요?
Stdin
에서 입력 스트림의 길이를 결정하는 가장 좋은 방법은 올바른 길이의 배열을 만들 수 있습니다. 예를 들어 getchar()
?입력을 저장하는 데 필요한 배열 길이 결정
while((ch = readchar()) != "\n") {
count++;
}
다음 계수의 크기와 배열을 생성 :
입력 스트림의 모든 문자에 엿과 같은 것을 사용하는 몇 가지 방법이 있나요?
코드를 입력하는 동안 몇 가지 유사한 답변이 있습니다.
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);
두 경우 모두 입력을 완료하면 입력을 무료로 잊지 마세요.
+1. 물론 프로덕션 구현에서는'malloc' 및'realloc'에 대한 모든 호출이 NULL인지 확인하기 위해 반환을 확인해야합니다. 또한이 구현은 입력에 NULL 문자를 허용하므로 결과를 안정적으로 해석하는 것이 어렵습니다. – Nemo
고마워요! 나는 C를 시작하기 때문에 모든 포인터를 제대로 배워야합니다. 빠른 질문 : 왜 여분의 0을 추가해야합니까?왜 그냥'input = realloc (input, count)'을 루프 뒤에서 똑바로 할 수 없습니까? – a3onstorm
정말 필요하지 않습니다. 그러나 두 가지 효과가 있습니다. 모든 문자열 관련 함수를'input'에 사용할 수 있으며, 마지막 줄에 count! = 0이 있어야합니다. – Marian
일반적으로 방법이 없습니다. 앞의 한 문자 만 들여다 볼 수 있으므로, 예에서와 같이 코드를 사용하면 문자가 이미 읽혀지고 카운트를 알고 메모리를 할당 할 수는 있어도 다시 읽을 수는 없습니다. 가능한 전략은 처음에 일부 메모리를 할당 한 다음 제한을 두드리는 경우 루프에서 길이를 두 배로 늘리면서 메모리를 재 할당하는 것입니다.
일반적인 유닉스 파일에서이 작업을 수행하는 한 가지 방법은 fseek
시스템 호출을 사용하여 파일 크기를 결정하는 것입니다. 죄송하지만 STDIN
은 검색 가능한 스트림이 아닙니다.
내가 알고있는 일반적인 경우를 처리하는 유일한 방법은 단순히 동적 메모리 할당을 사용하는 것입니다. 초기 버퍼로 가장 잘 추측 할 수 있습니다. 끝까지 도달하면 malloc
새 배열을 다시 시작합니다. 이 프로세스를 처리하는 실수는 많은 고전적인 보안 버그의 시작입니다.
명령 줄에서 전달할 수 있습니까? –
일반적인 방법은 배열을 동적으로 확장하여 배열을 읽고 채우는 것입니다. 이는 (a) 입력을 두 번 읽는 것보다 빠르고, (b) 입력 스트림을 찾을 수없는 경우 유일한 방법입니다. (모든 스트림에 대해 작동하는 코드는 검색 가능한 스트림에서만 작동하는 코드보다 재사용이 가능합니다.) – Nemo
그래,하지만 단락이나 다른 문자의 문자 수를 정확하게 계산하기를 원하지 않는다고 가정 해 봅시다. . – a3onstorm