Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从文本中获取行并放入链接列表中_C_Data Structures_Linked List - Fatal编程技术网

C 从文本中获取行并放入链接列表中

C 从文本中获取行并放入链接列表中,c,data-structures,linked-list,C,Data Structures,Linked List,我最近开始用C语言编写代码,并且正在关注来自的优秀项目。其中一项任务是反转文本文件中的行,以便: 这是一行 变成 行/是/是/这个 我决定把每一行放在一个链表中的一个节点上,然后颠倒这个链表。我的问题是,为什么我调用print\u list时结果为空经过一些调试后,看起来头节点没有在开始时设置为当前 另外,如果您对我的代码有一般性的评论,我将不胜感激,以便我可以学习。谢谢大家! #include <stdio.h> #include <stdlib.h> typedef

我最近开始用C语言编写代码,并且正在关注来自的优秀项目。其中一项任务是反转文本文件中的行,以便:

这是一行

变成

行/是/是/这个

我决定把每一行放在一个链表中的一个节点上,然后颠倒这个链表。我的问题是,为什么我调用
print\u list
时结果为空经过一些调试后,看起来
节点没有在开始时设置为
当前

另外,如果您对我的代码有一般性的评论,我将不胜感激,以便我可以学习。谢谢大家!

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

typedef struct node {
    char *line; 
    struct node *next;
} node_t;

void print_list(node_t *node) {
    while (node != NULL) {
        printf("%s\n", node->line);
        node = node->next;
    }
}

int main(int argc, char** argv) {
    FILE *fp = fopen(argv[1], "r");
    if (fp == NULL) {
        printf("cannot open file\n");
    }

    node_t *head = malloc(sizeof(node_t));
    head->line = NULL;
    head->next = NULL;

    char *line = NULL;
    size_t linecap = 0;
    ssize_t linelen;
    node_t *current = head;
    while ((linelen = getline(&line, &linecap, fp)) > 0) {
        current->line = line;
        current->next = (node_t *) malloc(sizeof(node_t));
        current = current->next;
    }
    current->next = NULL;
    print_list(head);
    fclose(fp);
    return 0;
}
#包括
#包括
类型定义结构节点{
字符*行;
结构节点*下一步;
}节点t;
无效打印列表(节点*node){
while(节点!=NULL){
printf(“%s\n”,节点->行);
节点=节点->下一步;
}
}
int main(int argc,字符**argv){
文件*fp=fopen(argv[1],“r”);
如果(fp==NULL){
printf(“无法打开文件\n”);
}
node_t*head=malloc(sizeof(node_t));
head->line=NULL;
head->next=NULL;
char*line=NULL;
尺寸\u t线帽=0;
塞泽特·莱宁;
节点_t*电流=头部;
而((linelen=getline(&line,&linecap,fp))>0){
当前->行=行;
当前->下一步=(node_t*)malloc(sizeof(node_t));
当前=当前->下一步;
}
当前->下一步=空;
打印列表(标题);
fclose(fp);
返回0;
}
  • 您分配了一个缓冲区,但未初始化其成员
    。这将导致在
    打印列表
    中使用时出现未定义的行为
  • 您应该将指针设置为
    NULL
    ,并将大小设置为0以分配缓冲区。当前,第一个输入的缓冲区被重用
  • printfu list(head)l
    应为
    printfu list(head)
试试这个:

int main(int argc, char** argv) {
    FILE *fp = fopen(argv[1], "r");
    if (fp == NULL) {
        printf("cannot open file\n");
    }

    node_t *head = NULL;

    char *line = NULL;
    size_t linecap = 0;
    ssize_t linelen;
    /* use pointer to node_t* for allocation */
    node_t **current = &head;
    while ((linelen = getline(&line, &linecap, fp)) > 0) {
        /* allocate buffer only if some data is read */
        *current = malloc(sizeof(node_t));
        if (*current == NULL) return 1;
        (*current)->line = line;
        (*current)->next = NULL;
        current = &(*current)->next;
        /* reset the parameter */
        line = NULL;
        linecap = 0;
    }
    print_list(head);
    fclose(fp);
    return 0;
}
  • 您分配了一个缓冲区,但未初始化其成员
    。这将导致在
    打印列表
    中使用时出现未定义的行为
  • 您应该将指针设置为
    NULL
    ,并将大小设置为0以分配缓冲区。当前,第一个输入的缓冲区被重用
  • printfu list(head)l
    应为
    printfu list(head)
试试这个:

int main(int argc, char** argv) {
    FILE *fp = fopen(argv[1], "r");
    if (fp == NULL) {
        printf("cannot open file\n");
    }

    node_t *head = NULL;

    char *line = NULL;
    size_t linecap = 0;
    ssize_t linelen;
    /* use pointer to node_t* for allocation */
    node_t **current = &head;
    while ((linelen = getline(&line, &linecap, fp)) > 0) {
        /* allocate buffer only if some data is read */
        *current = malloc(sizeof(node_t));
        if (*current == NULL) return 1;
        (*current)->line = line;
        (*current)->next = NULL;
        current = &(*current)->next;
        /* reset the parameter */
        line = NULL;
        linecap = 0;
    }
    print_list(head);
    fclose(fp);
    return 0;
}

“我决定将每一行放在一个链接列表的一个节点上,然后反转这个列表”-这将如何反转一行的内容,如您展示的示例中所示?似乎您希望每行一个链接列表,然后每个链接列表节点一个单词。这是一种方法。我只是希望每个节点有一行用于练习:始终检查
argc
,以确保在访问
argv[0]
之前,用户实际输入了命令行参数,关于:
if(fp==NULL){printf(“无法打开文件”);}
1)错误消息应输出到
stderr
,不
stdout
。2) 当错误指示来自C库函数时,还要将系统认为发生错误的文本原因输出到
stderr
。函数:
peror()
就是为此而设计的。建议:
perror(“fopen失败”)注意:这是一个不可恢复的错误。出现此错误时,不要继续执行程序,就好像调用
fopen()
成功一样。而是调用:
exit(exit\u失败)关于:``node\u t*current=头部;while((linelen=getline(&line,&linecap,fp))>0{current->line=line;current->next=(node_t*)malloc(sizeof(node_node_t*current=head);while((linelen=getline(&line,&linecap,fp))>0{current->line->line=line;current->next=(node_t*)malloc(sizeof(node_t*));current=current->next;}t) );current=current->next;}`1)在C中,不要强制转换从
malloc()
cont()返回的值:“我决定将每一行放在链接列表中的一个节点上,然后反转此列表”-这将如何反转您所展示的示例中的行内容?似乎您希望每行一个链接列表,然后每个链接列表节点一个单词。这是一种方法。我只是希望每个节点有一行用于练习:始终检查
argc
,以确保在访问
argv[0]
之前,用户实际输入了命令行参数,关于:
if(fp==NULL){printf(“无法打开文件”);}
1)错误消息应输出到
stderr
,不
stdout
。2) 当错误指示来自C库函数时,还要将系统认为发生错误的文本原因输出到
stderr
。函数:
peror()
就是为此而设计的。建议:
perror(“fopen失败”)注意:这是一个不可恢复的错误。出现此错误时,不要继续执行程序,就好像调用
fopen()
成功一样。而是调用:
exit(exit\u失败)关于:``node\u t*current=头部;while((linelen=getline(&line,&linecap,fp))>0{current->line=line;current->next=(node_t*)malloc(sizeof(node_node_t*current=head);while((linelen=getline(&line,&linecap,fp))>0{current->line->line=line;current->next=(node_t*)malloc(sizeof(node_t*));current=current->next;}t) );current=current->next;}`1)在C中,不要强制转换从
malloc()返回的值。
cont:这非常有用。对于
节点**当前=&head您正在创建一个指向头部内存位置的指针?在不立即使用的情况下,将指针初始化为null通常也是一种好的做法吗?谢谢这很有帮助。对于
节点**当前=&head您正在创建一个指向头部内存位置的指针?一般来说,这也是一个好主意吗