【发布时间】:2016-12-19 12:27:17
【问题描述】:
我必须阅读一系列必须是括号的字符,但我不知道用户输入了多少个字符。所以我想每次添加输入时都使用realloc。
我必须使用scanf 来读取字符
我编写了这段代码,但我想知道是否有更安全或更好的方法。
char* read(void)
{
int count = 0,
valid = 1;
char *str = NULL,
*tmp = NULL;
char input;
printf("Digita sequenza di parentesi da analizzare: ");
do
{
scanf("%c", &input);
tmp = (char *)realloc(str, (++count) * sizeof(char));
if(tmp != NULL)
{
str = tmp;
str[count-1] = input;
/* check sul carattere letto verificando che sia una parentesi (escluso ENTER) */
if((input != '(' &&
input != ')' &&
input != '[' &&
input != ']' &&
input != '{' &&
input != '}' &&
input != '\n') ||
((count == 1) &&
(input == '\n')))
valid = 0;
}
else
{
valid = 0;
free(str);
}
} while(input != '\n');
/* TODO */
/* str[count] = '\0'; */
return (valid) ? str : NULL;
}
【问题讨论】:
-
嗨,我认为有一个固定大小的缓冲区并在它满时填充它并重新分配更准确。
-
通常单独跟踪“使用的字节数”和“可用的字节数”,一旦用完就将“可用的字节数”加倍。这减少了分配的数量,并提高了性能。不推荐为每个输入字符进行堆分配。