我要阅读一系列必须括号的字符,但我不知道用户输入的字符数。因此,我想每次添加输入时都使用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;
}
答案 0 :(得分:1)
我不建议在每次迭代时都进行realloc。而是在开头使用一些最佳大小的缓冲区,然后仅在超过此大小时才进行重新分配。如下:
#define DEFAULT_STEP_SIZE 64
char* read(void)
{
int count = 0,
valid = 1,
num_alloc = 0;
char *str = NULL,
*tmp = NULL;
char input;
str = malloc(DEFAULT_STEP_SIZE * sizeof(char));
if(str == NULL){
return NULL;
}
num_alloc = 1;
printf("Digita sequenza di parentesi da analizzare: ");
do
{
scanf("%c", &input);
if(count > num_alloc * DEFAULT_STEP_SIZE){
++num_alloc;
tmp = (char *)realloc(str, (num_alloc * DEFAULT_STEP_SIZE) * sizeof(char));
if(tmp == NULL){
free(str);
return NULL;
}else{
str = tmp;
}
}
count++;
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;
} while(input != '\n');
/* TODO */
/* str[count] = '\0'; */
return (valid) ? str : NULL;
}