C 文件中的换行符strtok问题

C 文件中的换行符strtok问题,c,C,好的,我有一个格式如下的文件: 七, 一, 二, 三, 四, 五, 我必须读入它,并将其作为一个链表,同时将每个新节点添加到列表的头部。没什么大不了的。很简单。我的问题是我遇到了问题。我正在使用以下代码: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char number[10]; } numStruct; typedef struc

好的,我有一个格式如下的文件:

七,

一,

二,

三,

四,

五,

我必须读入它,并将其作为一个链表,同时将每个新节点添加到列表的头部。没什么大不了的。很简单。我的问题是我遇到了问题。我正在使用以下代码:

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


typedef struct{
        char number[10];
} numStruct;

typedef struct node{
        numStruct* numbers;
        struct node *next;
}Node;

void readNumbers(Node **head){
        FILE *inp = fopen("filelocation","r");
        char line[80];

        char *result;

        if(inp == NULL){
               printf("Oopsies doodles. We couldn't find this file!"); 
        }
         while(fgets(line,sizeof(line),inp)!=NULL){
                numStruct* numbers = malloc(sizeof(numStruct));
                result = strtok(line," "); 
                strcpy(numbers->number,result);
                Node* newNode = malloc(sizeof(Node));
                newNode->numbers = numbers;
                newNode->next = NULL;
                Node* oldHead = *head;
                *head = newNode;

                newNode -> next = oldHead;
                }
        fclose(inp);
        return;
}

void printNumbers(Node* head){
        Node* currentNode = head;
        while(currentNode !=NULL)
        {
                printf("%s",currentNode->numbers->number);
                currentNode = currentNode ->next;
        }
        return;
}

int main(void){
        Node *head = NULL;
        readNumbers(&head);
        printNumbers(head);
        return(0);
        }
#包括
#包括
#包括
类型定义结构{
字符数[10];
}numStruct;
类型定义结构节点{
numStruct*数字;
结构节点*下一步;
}节点;
无效读取编号(节点**头){
文件*inp=fopen(“文件位置”,“r”);
字符行[80];
字符*结果;
如果(inp==NULL){
printf(“糟糕的涂鸦,我们找不到这个文件!”);
}
while(fgets(line,sizeof(line),inp)!=NULL){
numStruct*编号=malloc(sizeof(numStruct));
结果=strtok(第“”行);
strcpy(数字->数字,结果);
Node*newNode=malloc(sizeof(Node));
新建节点->编号=编号;
newNode->next=NULL;
节点*oldHead=*head;
*头=新节点;
newNode->next=oldHead;
}
fclose(inp);
返回;
}
无效打印编号(节点*头){
节点*当前节点=头部;
while(currentNode!=NULL)
{
printf(“%s”,当前节点->编号->编号);
currentNode=currentNode->next;
}
返回;
}
内部主(空){
Node*head=NULL;
读取编号(&head);
打印号码(头);
返回(0);
}

我和斯特托克的问题。我已经尝试了\n和\r以及所有可能的组合,但仍然会出现错误。任何协助都将不胜感激

这应该是一个评论,但我没有足够的声誉:-(

你确定你的代码正在出错吗?在我的计算机上,你的代码运行得很好。唯一的问题是内存泄漏。你调用了
malloc()
很多次,但从来没有调用过
free()
。还记得对
结果
变量调用
free()
,它指向
strok()分配的内存

我的输出:


5
4
3
2
1
7
是的,第一行是空的

Valgrind下面的输出:(“a”是二进制文件,我的用户名是“user”,a在我的主文件夹下)


这应该是一个评论,但我没有足够的声誉:-(

你确定你的代码正在出错吗?在我的计算机上,你的代码运行得很好。唯一的问题是内存泄漏。你调用了
malloc()
很多次,但从来没有调用过
free()
。还记得对
结果
变量调用
free()
,它指向
strok()分配的内存

我的输出:


5
4
3
2
1
7
是的,第一行是空的

Valgrind下面的输出:(“a”是二进制文件,我的用户名是“user”,a在我的主文件夹下)


seg故障发生在哪一行代码上?是否确认为
strtok
行?如果尚未确认,调试器可以立即告诉您。既然输入中每行有一个数字,您为什么需要使用
strtok
块,请确保在报告后退出,而不是失败,并毕竟使用空指针。
numbers->number
是一个固定大小的字符数组。使用
number
numbers
几乎可以看到的所有内容都会让人困惑。在严重的C代码中,您不能让它像那样打开。您必须确保没有溢出或防止溢出,例如使用
strncpy
,尽管这比乍一看要复杂。“如果计数小于或等于strSource的长度,则不会自动将空字符追加到复制的字符串。”seg故障发生在哪一行代码上?是否确认为
strtok
行?如果尚未确认,调试器可以立即告诉您。既然输入中每行有一个数字,您为什么需要使用
strtok
块,请确保在报告后退出,而不是失败,并毕竟使用空指针。
numbers->number
是一个固定大小的字符数组。使用
number
numbers
几乎可以看到的所有内容都会让人困惑。在严重的C代码中,您不能让它像那样打开。您必须确保没有溢出或防止溢出,例如
strncpy
,尽管这比乍一看要复杂。“如果计数小于或等于strSource的长度,则不会自动将空字符追加到复制的字符串中。”这很令人沮丧。这肯定是我的错误。“分段错误(核心转储)”@sloppycanada这太糟糕了。如果它一直在出错,可能按照链接中的过程操作。@sloppycanada您发布的代码和我的测试代码之间的唯一区别是文件名字段。可能检查您的计算机上是否有
filelocation
文件……可能检查程序的$PATH$变量,这是frustra这绝对是我这边的错误。“分割错误(核心转储)”@sloppycanada这太糟糕了。如果它一直在出错,可能按照链接中的过程操作。@sloppycanada您发布的代码和我的测试代码之间的唯一区别是文件名字段。可能检查您的计算机上是否有
filelocation
文件……可能检查程序的$PATH$变量