我想创建一个链接列表,其中包含input.txt文件中的姓名。名和姓用空格分隔,姓后面有一个换行符。
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
typedef struct node{
char* firstname;
char* lastname;
struct node *next;
}node;
node *add(node *head, char* fnme, char* lnme){
node *new_node;
new_node = (node*)malloc(sizeof(node));
if(new_node == NULL)
printf("Fehler bei Speicher reservierung...");
new_node->firstname = (char*)malloc(100*sizeof(char));
if(new_node->firstname == NULL)
printf("Fehler bei Speicher reservierung...");
new_node->lastname = (char*)malloc(100*sizeof(char));
if(new_node->lastname == NULL)
printf("Fehler bei Speicher reservierung...");
strcpy(new_node->firstname, fnme);
strcpy(new_node->lastname, lnme);
if(head == NULL){
head = new_node;
head->next = NULL;
return head;
}
node *current;
current = head;
while(current->next != NULL){
current = current->next;
}
current->next = new_node;
new_node->next = NULL;
return head;
}
void print(node *head){
node *current;
current = head;
while(current != NULL){
printf("%s %s\n", current->firstname, current->lastname);
current = current->next;
}
}
int main(){
node *head = NULL;
char character;
FILE *fp;
fp = fopen("input.txt", "r");
while ((character = fgetc(fp)) != EOF) {
char *fnme, *lnme;
fnme = (char*)malloc(100 * sizeof(char));
if(fnme == NULL)
printf("Fehler bei Speicher reservierung...");
lnme = (char*)malloc(100 * sizeof(char));
if(lnme == NULL)
printf("Fehler bei Speicher reservierung...");
int i = 0;
while (character != ' ') {
fnme[i++] = character;
character = fgetc(fp);
}
fnme[++i] = '\0'; // NULL-terminate
i = 0;
while (character != '\n') {
lnme[i++] = character;
character = fgetc(fp);
}
lnme[++i] = '\0'; // NULL-terminate
head = add(head, fnme, lnme);
free(fnme);
free(lnme);
}
print(head);
return 0;
}
我从来没有用过strcat,不知怎么的,它不起作用。我也试过用字符数组代替指针,但结果是一样的。也许我必须使用其他函数?
更新1:
不知何故,输出很奇怪,似乎它从来没有进入过add()函数的if块。在. txt文件中输出2个名称:
点点
彼得·帕克
克拉克·肯特
更新2:
更改了add()函数的返回类型,现在它可以工作了
3条答案
按热度按时间fnx2tebb1#
稍微修改一下你的代码,它应该可以工作。你不能以那种方式使用
strcat
,因为strcat
的第二个参数接受const char *
,而你有char
,所以你的代码不会编译。这里还值得注意的是:我假设函数
add
将为fnme
和anme
创建一个deepcopy,否则,您不能在这里简单地释放它们。vs3odd8k2#
strcat
绝对不适合使用。正如编译器应该告诉你的那样,你首先传入了错误类型的变量。它需要2个字符串,而character
只是一个char
。C中的字符串是以NUL结尾的,并且刚刚为
anme
和fnme
分配了内存,它们都不会被初始化,所以不会包含NUL结尾,所以你会遇到未定义的行为。相反,只要把它们当作数组,在读入字符时存储它们,然后记住在阅读所有字符后以NUL终止它。
此方法还允许您检查
count
是否超出了分配的大小,在本例中为99,因为NUL字符需要最后一个空间。vnzz0bqm3#
你在
add()
函数中有一些错误。这是完整的解决方案。顺便说一句,由于这是一个后续问题,你最好在新的帖子中问它,而不是更新原来的帖子。