我有一个用C语言编写的程序,但是我遇到了一个问题,无法理解其影响。该应用程序将一系列单词作为命令行输入进行读取。在读取输入时,它逐个将单词放入列表中,然后打印该列表。令我困惑的是,为什么在循环内添加的值不会被正确打印,而在循环外添加的值则会被正确打印。也就是说,无论用户输入的是哪些值,只有最后一个值会被打印出来。此外,它将按照输入的值的数量重复打印相同的值。两个主要嫌疑人是push和printList方法:
void push(struct List * list, char* newValue){
assert(list != NULL);
assert(newValue != NULL);
Node* node = createNode();
node->data = newValue;
node->next = NULL;
if(list->firstNode != NULL){
node->next = list->firstNode;
list->firstNode = node;
}
else list->firstNode = node;
}
void printList(struct List * list){
assert(list != NULL);
Node *node = list->firstNode;
while(node->next != NULL){
printf("%s ", node->data);
node = node->next;
}
if(node != NULL) printf("%s ", node->data);
}
但我在那里找不到任何错误。我的做法是将有和没有 while 循环的行为进行比较:
int main(){
struct List* list = createList();
char s[256];
int a;
push(list, "he");
push(list, "bee");
push(list, "gee");
while(scanf("%s", &s) == 1) push(list, s);
printList(list);
}
我得到的输出是:
而输入是:c c c gee bee he
所以我期望得到的是:a b c
我错过了什么?非常感谢您的任何建议。c b a gee bee he
附:上述使用的类型定义和方法为:
typedef struct Node {
char* data;
struct Node *next;
} Node;
typedef struct List {
struct Node *firstNode;
} List;
Node *createNode(){
Node* node = malloc(sizeof(struct Node));
assert(node != NULL);
node->data = "";
node->next = NULL;
return node;
}
List *createList(){
List* list = malloc(sizeof(struct List));
list->firstNode = NULL;
assert(list != NULL);
return list;
}
createList
中,您将断言放在了错误的位置,因此它将没有任何效果:如果list
为空,那么在到达断言之前,您将会遇到段错误。在尝试访问指针返回值之前,请始终检查malloc
的返回值。 - Tom Karzesnode->data = newValue
赋值的是一个 指针,当你调用push(list, s);
时,每次传递的都是同一个指针。 - n. m.push
之前,您需要为字符串分配存储空间。对于字符串常量,这不是问题,但对于由scanf
读取的字符串,您一遍又一遍地使用自动数组s
。您可以使用strdup
来分配存储空间并复制字符串。 - Tom Karzes