C语言 从.txt文件读取名称并将其添加到链接列表

pb3skfrl  于 2022-12-22  发布在  其他
关注(0)|答案(3)|浏览(126)

我想创建一个链接列表,其中包含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()函数的返回类型,现在它可以工作了

fnx2tebb

fnx2tebb1#

稍微修改一下你的代码,它应该可以工作。你不能以那种方式使用strcat,因为strcat的第二个参数接受const char *,而你有char,所以你的代码不会编译。
这里还值得注意的是:我假设函数add将为fnmeanme创建一个deepcopy,否则,您不能在这里简单地释放它们。

while ((character = fgetc(fp)) != EOF) {
    char *fnme, *anme;
    fnme = malloc(100 * sizeof(char));
    anme = malloc(100 * sizeof(char));

    int i = 0;
    while (character != ' ') {
        fnme[i++] = character;
        character = fgetc(fp);
    }
    fnme[++i] = '\0';   // NULL-terminate

    i = 0;
    while (character != '\n') {
        anme[i++] = character;
        character = fgetc(fp);
    }
    anme[++i] = '\0';  // NULL-terminate

    add(head, fnme, anme);   // Assume 'add' will make deep copy of both fname and 
                             // anme, otherwise you cannot free them here.
    free(fnme);
    free(anme);

}
vs3odd8k

vs3odd8k2#

strcat绝对不适合使用。正如编译器应该告诉你的那样,你首先传入了错误类型的变量。它需要2个字符串,而character只是一个char
C中的字符串是以NUL结尾的,并且刚刚为anmefnme分配了内存,它们都不会被初始化,所以不会包含NUL结尾,所以你会遇到未定义的行为。
相反,只要把它们当作数组,在读入字符时存储它们,然后记住在阅读所有字符后以NUL终止它。

int count = 0;

do{  
    fnme[count++] = character;
    character = fgetc(fp);
}while(character != ' ');
fnme[count]='\0'; // Need to NUL terminate the string

count = 0; // Remember to reset count to 0
do{  
    anme[count++] = character;
    character = fgetc(fp);
}while(character != '\n');
anme[count]='\0'; // Need to NUL terminate the string

此方法还允许您检查count是否超出了分配的大小,在本例中为99,因为NUL字符需要最后一个空间。

vnzz0bqm

vnzz0bqm3#

你在add()函数中有一些错误。这是完整的解决方案。顺便说一句,由于这是一个后续问题,你最好在新的帖子中问它,而不是更新原来的帖子。

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

typedef struct node{
  char *forame;
  char *aftername;
  struct node *next;
}node;

void add(node **head, char* fnme, char* lnme){
  node *new_node;
  new_node = (node*)malloc(sizeof(node));
  new_node->forame = (char*)malloc(100*sizeof(char));
  new_node->aftername = (char*)malloc(100*sizeof(char));

  strcpy(new_node->forame, fnme);
  strcpy(new_node->aftername, lnme);

  if (*head == NULL){
    *head = new_node;
    new_node->next = NULL;
    return;
  }

  node *current;
  current = *head;

  while(current->next != NULL){
     current = current->next;
  }

  current->next = new_node;
  new_node->next = NULL;
}

void print(node *head){
   node *current;
   current = head;

  while(current != NULL){
      printf("%s %s\n", current->forame, current->aftername);
      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));
      lnme = (char*)malloc(100 * sizeof(char));

      int i = 0;
      while (character != ' ') {
          fnme[i++] = character;
          character = fgetc(fp);
      }
      fnme[++i] = '\0';

      i = 0;
      while (character != '\n') {
          lnme[i++] = character;
          character = fgetc(fp);
      }
      lnme[++i] = '\0';

      add(&head, fnme, lnme);

     free(fnme);
     free(lnme);
  }

  print(head);
  return 0;
}

相关问题