Следующий код устанавливает максимальный размер строки, считанный с stdin. Я бы предпочел не жестко кодировать определенную длину строки и иметь гибкость для обработки любой длины буфера. Каковы хорошие стратегии, позволяющие обрабатывать любые размеры?Чтение из stdin в C без максимальной длины буфера
Если эти стратегии намного сложнее, есть ли способ, по крайней мере, гарантировать, что getline
не будет переполняться? Благодарю.
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define P 20
int main()
{
size_t size = 1920;
char *line;
// record row; /* structure to store fields */
char tokens[P][41];
int p;
char delims[] = ","; /* ", |" */
char *result = NULL;
line = (char *) malloc(size + 1);
while(getline(&line, &size, stdin) != -1)
{
/* chomp */
line[strlen(line)-1] = '\0';
/* load char array */
result = strtok(line , delims);
p = 0;
while(result != NULL && (p < P))
{
strcpy(tokens[p++] , result);
result = strtok(NULL, delims);
}
if (p != P)
{
fprintf(stderr,"Wrong number of input fields.\nFormat: ID,x1, ... ,x%d\n",P);
exit(-1);
}
/* load record (atol, atof etc... , skipped for brevity) and work with record */
return 0;
}
Обычно я решаю его с использованием буферов вместо строк, а затем используя вызовы POSIX, поскольку мне часто требуются неблокирующие вызовы. Если я не знаю размер заранее, я могу вырастить буфер, используя 'realloc()' либо линеаризованно, либо экспоненциально, в зависимости от обстоятельств. Также возможно уменьшить его, когда большой размер больше не нужен, также используя 'realloc()'. –