C 仅打印上次输入的字符串链表

C 仅打印上次输入的字符串链表,c,string,linked-list,C,String,Linked List,我被困在这上面有一段时间了,有人能帮忙吗? 我的链表代码适用于整数,但似乎不适用于字符串,它只打印最后一个条目,知道吗? 谢谢 #包括 #包括 #包括“node.h” #包括 类型定义结构节点{ char*val; 结构节点*下一步; }节点; int main(){ //读取文本文件 文件*fp; fp=fopen(“dict.txt”、“r”); //链表 chari[10]; node*head=malloc(sizeof(node)); 节点*cursr=头部; while(fscanf

我被困在这上面有一段时间了,有人能帮忙吗? 我的链表代码适用于整数,但似乎不适用于字符串,它只打印最后一个条目,知道吗? 谢谢

#包括
#包括
#包括“node.h”
#包括
类型定义结构节点{
char*val;
结构节点*下一步;
}节点;
int main(){
//读取文本文件
文件*fp;
fp=fopen(“dict.txt”、“r”);
//链表
chari[10];
node*head=malloc(sizeof(node));
节点*cursr=头部;
while(fscanf(fp,“%s”,i)!=EOF)
{
fscanf(fp,“%s”,i);
//strcpy(cursr->val,i);
cursr->val=i;
printf(“读取字符串1 |%s |\n”,光标->val);
node*newnode=malloc(sizeof(node));
cursr->next=newnode;
cursr=newnode;
}
cursr->next=NULL;
cursr=头;
while(光标->下一步!=NULL)
{
printf(“%s”,光标->值);
cursr=cursr->next;
}
}

试试这个。它会起作用的

#include<stdlib.h>
#include<stdio.h>
//#include "node.h"
#include <string.h>

typedef struct node {
   //char* val;
   char val[10];
   struct node* next;
 }node;

int main(){

// read text file
FILE * fp;
fp = fopen ("dict.txt", "r");

//  linked list

char i[10];
//int i;

node* head = malloc(sizeof(node));
node* cursr= head;

while (fscanf(fp, "%s", i) !=EOF)
{
    //fscanf(fp, "%s", i);
    strcpy(cursr -> val,i);
    //cursr -> val = i;
    printf("Read String1 |%s|\n", cursr->val );
    node* newnode = malloc(sizeof(node));
    cursr -> next = newnode;
    //cursr = newnode;
    cursr = newnode;
}

cursr->next = NULL;
cursr=head;

while  (cursr -> next != NULL)
{
    printf("%s",cursr->val);
    cursr = cursr -> next;
}

}
#包括
#包括
//#包括“node.h”
#包括
类型定义结构节点{
//char*val;
char-val[10];
结构节点*下一步;
}节点;
int main(){
//读取文本文件
文件*fp;
fp=fopen(“dict.txt”、“r”);
//链表
chari[10];
//int i;
node*head=malloc(sizeof(node));
节点*cursr=头部;
while(fscanf(fp,“%s”,i)!=EOF)
{
//fscanf(fp,“%s”,i);
strcpy(cursr->val,i);
//cursr->val=i;
printf(“读取字符串1 |%s |\n”,光标->val);
node*newnode=malloc(sizeof(node));
cursr->next=newnode;
//cursr=newnode;
cursr=newnode;
}
cursr->next=NULL;
cursr=头;
while(光标->下一步!=NULL)
{
printf(“%s”,光标->值);
cursr=cursr->next;
}
}

你为什么要评论strcpy(cursr->val,i)退出?我想那条线可以解决你的问题。当然,假设
cursr->val
已经分配了所需的空间。@Kninnug他试图在下一行分配空间。但是他应该使用
strcpy
。假设
node
val
成员是
char*
(因为您出于任何原因选择不包含
节点的定义),考虑这个:我不理解,<代码> CursR> Val= i;
只将
i[]
缓冲区的地址存储在节点的
val
指针成员中,因此列表中的每个节点一旦构建,都有一个
val
指向相同的
i[]
缓冲区,您可能需要查看指针在C中的工作方式。因此我对//strcpy(cursr->val,i)进行了注释;因为这给了我一个核心。这是我的节点定义:
typedef结构节点{char*val;结构节点*next;}node;请不要在这里张贴代码。它属于您的问题(以及所有其他代码)。无论如何,丢失
cursr->val=i分配,放回您的
strcpy
,并将您的节点
val
成员更改为
char-val[10]这可能是“修复”这个问题的最快方法(我经常使用这个术语)。
#include<stdlib.h>
#include<stdio.h>
//#include "node.h"
#include <string.h>

typedef struct node {
   //char* val;
   char val[10];
   struct node* next;
 }node;

int main(){

// read text file
FILE * fp;
fp = fopen ("dict.txt", "r");

//  linked list

char i[10];
//int i;

node* head = malloc(sizeof(node));
node* cursr= head;

while (fscanf(fp, "%s", i) !=EOF)
{
    //fscanf(fp, "%s", i);
    strcpy(cursr -> val,i);
    //cursr -> val = i;
    printf("Read String1 |%s|\n", cursr->val );
    node* newnode = malloc(sizeof(node));
    cursr -> next = newnode;
    //cursr = newnode;
    cursr = newnode;
}

cursr->next = NULL;
cursr=head;

while  (cursr -> next != NULL)
{
    printf("%s",cursr->val);
    cursr = cursr -> next;
}

}