从文件中读取某个字符串时程序执行中断

Posted

技术标签:

【中文标题】从文件中读取某个字符串时程序执行中断【英文标题】:Program execution interrupted when certain String is read from File 【发布时间】:2018-02-27 20:52:50 【问题描述】:

我的代码有一个小问题,希望您能帮助我。 下面的程序读取写入 txt 文件的名称,并将它们存储在链表中,然后在命令行上打印出来。

该列表由以下名称组成:

Gustav Mahler
Frederic Chopin
Ludwig van Beethoven
Johann-Wolfgang Von-Goethe

但是当我运行程序时,程序的执行被中断,无论是在打印列表之前还是之后。

如果我删除最后一行,它会完美运行,但是当我将它添加回列表或用随机组合替换它时,例如“jlajfi3jrpiök+kvöaj3jiijm.--aerjj”,它会再次停止。

有人可以向我解释为什么程序执行会中断吗?

提前谢谢你! :)

这是程序:

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

typedef struct list 
    char* name;
    struct list *next;
NODE;

char * getString(char *source);

int main() 

FILE *fpointer = NULL;              
char filename[100];

puts("\nEnter the name of the file:\n");
gets(filename);

if((fpointer = fopen(filename, "r")) == NULL ) 
    printf("\nThe file you have chosen is not valid.\n");
    return 1;


char buffer[200];
NODE *head = NULL;
NODE *current = NULL;


while(fgets(buffer, 200, fpointer) != NULL) 

    NODE *node = (NODE *) malloc(sizeof(NODE));                         
    node -> next = NULL;

    node -> name = getString(buffer);


    if(head == NULL) 
        head = node;
     else 
        current -> next = node;
    

    current = node;



current = head;
while(current) 
    printf("%s", current -> name);
    current = current -> next;



return 0;



char * getString(char* source) 
    char* target = (char*) malloc(sizeof(char));
    strcpy(target, source);
    return target;

【问题讨论】:

malloc(sizeof(char)) 分配 1 字节,只够一个字符串终止符!建议char* target = malloc(strlen(source) + 1)); 甚至char* target = strdup(source); 请阅读Why is the gets function so dangerous that it should not be used? 【参考方案1】:

getString 中,您没有为要复制的字符串分配足够的空间:

char* target = (char*) malloc(sizeof(char));

这只是为单个字符分配空间。您需要足够的字符串长度,再加上 1 个空终止字节:

char* target = malloc(sizeof(strlen(source) + 1);

您实际上可以通过调用strdup 来替换整个函数,它的作用相同。

另外,don't cast the return value of malloc 和 never use gets

【讨论】:

char *target = strdup(source) 为您完成所有繁重的工作

以上是关于从文件中读取某个字符串时程序执行中断的主要内容,如果未能解决你的问题,请参考以下文章

请问如何从数据库中读取具体某个数据?

如何在 Spring Boot 中从应用程序属性文件中读取 jpa 命名查询?

安装时应用程序无法正常运行

从外部配置文件中读取连接字符串

从标准输入读取所有文本到字符串

读取文件中某个字符串前面的内容,两种方法