【问题标题】:Storing input from user into linked list using array使用数组将来自用户的输入存储到链表中
【发布时间】:2017-10-12 18:31:07
【问题描述】:

所以我试图从用户那里获取输入并将其存储在链表中,使用数组(每 5 个字符创建一个新的链表)。获得EOF后我想打印输入(实际上打印每个链表中的数组) 这是我的代码:

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

#define MAX 5



 typedef struct charNode {
    int arr[MAX];
    struct charNode *next;
} charNode;


void addNode();
void printAll();

	

    int main(){
	  int c,i;
 		charNode *head=malloc(sizeof(charNode));
 		charNode *current=head;

 while((c=getchar())!=EOF){
 	while(i<MAX){
		current->arr[i++]=c;
	}
	i=0;
	addNode(current);
 }
	printAll(head);


	return 0;
 }
	void addNode(charNode *current){
		 struct charNode *link = (struct charNode*) malloc(sizeof(struct charNode));
  		 current->next =link;
  		 link->next = NULL;
		 current=current->next;
	} 

	void printAll(charNode *head){
		int j=0;
		while(head->next!=NULL){
			while(j<MAX){
				printf("\n %d \t",head->arr[j++]);
			}
				printAll(head->next);
		}
		return;
	}

我收到“分段错误(核心转储)”错误..

【问题讨论】:

    标签: c arrays linked-list segmentation-fault runtime-error


    【解决方案1】:

    这是未定义的行为

    int c,i;
    charNode *head=malloc(sizeof(charNode));
    charNode *current=head;
    
    while((c=getchar())!=EOF){
      while(i<MAX){
        current->arr[i++]=c;
      }
    

    因为您使用 i uninitialized 来访问您的数组,这可能会产生分段错误。


    改变这个:

    printf("\n %d \t",head->arr[j++]);
    

    到这里:

    printf("\n %c \t",head->arr[j++]);
    

    以便您打印字符,而不是数字。


    只需将i 初始化为 0 即可开始,祝调试愉快! =)

    【讨论】:

    • 感谢您的快速回复!初始化解决了“分段错误(核心转储)”问题,它设法在终端上打印一些东西,但它不打印字符。它打印“10 10 10 10 10 0 0 0 0 0”
    • @AntonFreid 欢迎您。我更新了我的答案。希望有帮助。如果您觉得您还有其他问题,请发布一个新问题! ;) 如果你愿意,接受我的回答。
    • 嘿@gsamaras,再次感谢您尝试帮助我,像您说的那样更改 printf 函数,但没有帮助,因为 struct 中的数组是 int 类型。我觉得问题出在指针上,因为它打印的是整数而不是字符。我认为它可能是打印地址,但我不知道。调试也无济于事,因为我从文件中获取输入,但我不知道为什么,但调试器认为输入是命令
    • @AntonFreid 也许。但是请注意,使用%c,10 将被转换为其 ASCII 字符,这些字符将被打印出来,但并非所有 ASCII 代码都是可见的。
    • @AntonFreid 为什么将字符存储为整数?
    【解决方案2】:
    int main(){
        char c;
        charNode *head=malloc(sizeof(charNode));
        charNode *current=head;
    
        int i = 0;
    
        while((c=getchar())!=EOF){
            getchar();
            while(i<MAX){
                current->arr[i++]=c;
            }
            i=0;
            addNode(&current);
        }
    
        printAll(head);
    
    
        return 0;
    }
    
    void addNode(charNode **current){
        struct charNode *link = malloc(sizeof(struct charNode));
        link->next = NULL;
        (*current)->next =link;
        *current=(*current)->next;
    } 
    
    void printAll(charNode *head){
        int j=0;
        if(head!=NULL){
            while(j<MAX){
                printf("%c\n",head->arr[j++]);
            }
            if(head->next != NULL)
                printAll(head->next);
        }
    }
    

    我稍微更改了您的代码。尤其要好好看看 addNode()。现在它可以正常工作了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2019-12-22
      相关资源
      最近更新 更多