gpt4 book ai didi

c - 将用户输入作为历史记录返回到列表中

转载 作者:行者123 更新时间:2023-11-30 19:25:55 27 4
gpt4 key购买 nike

我正在开发一个小程序,它将获取用户输入,然后将该输入存储到链接列表中,最后打印用户输入的历史记录。

因此,如果用户输入字符串“hello world”,则程序将显示

1 hello world

但是,如果用户按 1 输入另一个字符串“hi everything”,那么结果应该显示

1 hello world
2 hi everyone

但是我的程序无法正常工作,而是显示了这一点

1 hello world
2 hello world

我认为这与 fgets 有关,因为当我手动输入带有历史记录的字符串时,我得到了正确的结果

它基本上只会重复用户输入的最后一个字符串。请帮忙!

我的代码

#include <stdio.h>
#include <stdlib.h>

int string_length(char* str){
int length = 0;
int i = 0;
for(i = 0; str[i] != '\0'; i++){
length += 1;
}
return length;
}

typedef struct s_Item {
int id;
char* str;
struct s_Item* next;
} Item;

typedef struct s_List {
struct s_Item* root;
} List;

List* init_history(){
List *list = NULL;
list = malloc(sizeof(List));
return list;
}

void add_history(List *list, char *str){
Item *newItem = (Item*)malloc(sizeof(Item*) * 500);
newItem->str = str;

if (list->root == NULL){
newItem->id = 1;
list->root = newItem;
}
else{
Item *history = list->root;
newItem->id = 1;

while (history->next != NULL){
newItem->id += 1;
history = history->next;
}
history->next = newItem;
newItem->id += 1;
}
}

char *get_history(List *list, int id){
Item *node = list -> root;
char *info = "";


while(node!= NULL){
if(node->id ==id){
info= node->str;
return info;
}
node = node->next;
}

return info;
}


void print_history(List* list){
Item* p = list->root;
printf("History: \n");
while(p){
if(p->str)
printf("%d %s \n", p->id, p->str);
p = p->next;
}
}

int main(){
char s[100];

char c = '0';
List *historyList = init_history();
while(1){

printf("type 1 to save string to history, 2 to view history or 3 to quit: \n");
fgets(s, 100, stdin);

size_t ln = string_length(s)-1;
if (s[ln] == '\n')
s[ln] = '\0';

c = *s;

if(c == '3'){
printf("program terminating...\n");
break;

}
else if(c == '2'){
printf("Printing History...\n");
print_history(historyList);
}
else{
printf("Enter string: ");
char buffer[50];
fgets(buffer, 50, stdin);
printf("BUFFER: %s\n", buffer);

//add history
add_history(historyList, buffer);
print_history(historyList);
}
}
}

最佳答案

fgets 每次都会填充相同的缓冲区,因此您在列表中存储了同一项目的多个副本。 main 中的缓冲区。 (考虑strdup?)

而且你的 malloc 也太慷慨了。您需要分配列表(而不是指针)的大小。

Item *newItem = (Item*)malloc(sizeof(Item) );

在某些时候,需要释放列表中的项目,在其中释放字符串和指向项目内存的指针。

关于c - 将用户输入作为历史记录返回到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58246046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com