我有一个程序,可以将用户输入读取到名为 inputBuffer
的 char 数组中,并存储 char 数组的长度:
length = read(STDIN_FILENO, inputBuffer, 80);
我希望能够存储过去的 10 个输入,以便可以访问它们。当第 11 个输入进来时,我需要删除第一个输入,所以现在只存储输入 2-11。这可以以某种方式用链表完成吗?
这个答案使用一个结构的环形缓冲区,这些结构保存字符串和长度,正如 OP 所要求的那样。当缓冲区换行时,将释放以前的字符串内存并初始化新记录。最早的记录位于索引 first_rec
处,并且有 num_recs
条记录。为了这个例子,我的主要循环结束测试是当有一个空白条目时。我在初始化时有点懒惰,假设静态数组的字符串指针初始化为 NULL
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RECORDS 10
#define BUFSIZE 999
typedef struct {
int length;
char *input;
} inpstruct;
inpstruct history [RECORDS];
int first_rec;
int num_recs;
void show_history (void) {
int i, index;
for (i=0; i<num_recs; i++) {
index = (first_rec + i) % RECORDS;
printf("Index: %-2d Length: %-3d Input: %sn", index,
history[index].length, history[index].input);
}
}
int main(void) {
char buffer [BUFSIZE+1];
int len, index;
while (fgets(buffer, BUFSIZE, stdin) != NULL) {
len = strlen(buffer);
if (len && buffer[len-1]=='n')
buffer [--len] = 0; // truncate newline
if (len == 0)
break;
index = (first_rec + num_recs) % RECORDS;
if (history[index].input != NULL) // release previous record
free (history[index].input);
if ((history[index].input = malloc(len+1)) == NULL) {
perror ("malloc() failure");
return 1;
}
strcpy (history[index].input, buffer);
history[index].length = len;
if (num_recs < RECORDS)
num_recs++;
else
first_rec = (first_rec + 1) % RECORDS;
show_history();
}
return 0;
}