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$变量