我对我的函数的约束是它从流,文件或标准输入中读取,并且它读取到换行符并在检测到EOF时结束。
char* getLine(FILE* stream)
{
int capacity = LINE_MAX;
char* buffer = malloc(capacity);
int len = 0;
char ch;
while ((ch = fgetc(stream)) != '\n' && ch != EOF) {
if (ch == EOF)
return NULL;
if (len >= capacity) {
capacity *= 2;
buffer = realloc(buffer, len * sizeof(char));
}
buffer[len++] = ch;
}
buffer[len] = '\0';
if (buffer == NULL)
return NULL;
return buffer;
}
我不能指望我的输入有特定的长度。我的主要问题是,在main中使用它时;
int main()
{
FILE* stream = stdin; // stdin now
while (true) {
char cmd[COMMAND_MAX];
char* arg;
char* rest;
char* line;
printf("command $: ");
line = getLine(stream);
if (line == NULL) {
exit(EXIT_SUCCESS);
}
arg = malloc(REMAINING_MAX * sizeof(char));
rest = malloc(REMAINING_MAX * sizeof(char));
int arguments = sscanf(line, "%s %s %[^\n]s", cmd, arg, rest);
free(arg);
printf("\n");
printf("%s, %s, %s", cmd, arg, rest);
free(rest);
free(line);
return 0;
}
当我按Enter键时,在实际程序中,我会收到重复的输入,几乎就像它没有输入数据一样。它只是卡在记忆中。如果我用scanf做了这个,它可以很好地工作,但问题是我不能像以前发现的那样为它动态分配内存。