#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char buffer[10];
char *input = 0;
size_t cur_len = 0;
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
size_t buf_len = strlen(buffer);
char *extra = realloc(input, buf_len + cur_len + 1);
if (extra == 0)
break;
input = extra;
strcpy(input + cur_len, buffer);
cur_len += buf_len;
}
printf("%s [%d]", input, (int)strlen(input));
free(input);
return 0;
}
이것은 완전한 입력 행을 제공하는 최소한의 변경 사항에 관한 것입니다. 이것은 한 번에 최대 9 바이트 씩 공간을 늘립니다. 그것은 최선의 방법은 아니지만 더 나은 방법 (할당 된 공간을 두 배로 늘리고 사용량과 할당량을 기록하는 방법을 유지하는 것)이 필요한 추가 부기가 있습니다. cur_len
은 단말 null을 제외하고 input
이 가리키는 공간에 문자열의 길이를 기록합니다. 또한 extra
을 사용하면 할당 실패시 메모리 누수가 방지됩니다.
strcpy()
작업은 합법적으로 memmove(input + cur_len, buffer, buf_len + 1)
(이 맥락에서, 대신 memmove()
의 memcpy()
을 사용할 수 있지만 memmove()
항상 작동합니까하면서 memmove()
를 사용하는 것이 더 신뢰할 수 있도록 항상 작동하지 않습니다)로 대체 될 수있다. 길이 두 배와
- 할당 된 공간의 양을 cur_max
변수 기록, 사용중인 공간이 얼마나 cur_len
기록.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char buffer[10];
char *input = 0;
size_t cur_len = 0;
size_t cur_max = 0;
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
size_t buf_len = strlen(buffer);
if (cur_len + buf_len + 1 > cur_max)
{
size_t new_len = cur_max * 2 + 1;
if (buf_len + 1 > new_len)
new_len = buf_len + 1;
char *extra = realloc(input, new_len);
if (extra == 0)
break;
input = extra;
cur_max = new_len;
}
strcpy(input + cur_len, buffer);
cur_len += buf_len;
}
printf("%s [%d]", input, (int)strlen(input));
free(input);
return 0;
}
'realloc'을 참조하십시오. 그리고 매번 할당을 두 배로 늘리거나 버퍼로 직접 읽어들이는 전략을 고려하십시오. BTW :'size_t '의 printf 형식은'% zu'입니다. – Deduplicator
가지고 있다면'fgets' 대신에''getline' (http://linux.die.net/man/3/getline)을 사용해보십시오. – 5gon12eder
getline에 대해 알고 있지만, fgets를 사용해야합니다. – lllook