gpt4 book ai didi

c - C 中 scanf 的段错误。没有意义

转载 作者:行者123 更新时间:2023-11-30 19:45:23 25 4
gpt4 key购买 nike

我以前已经这样做过无数次了,由于某种原因,现在我似乎无法在 C 中扫描字符串。这是我的特定功能的代码:

int putIn(NODE **head,NODE **current,NODE **prev) {
char tempName[40];
printf("Enter party name: ");

scanf("%s",tempName);
printf("Good?");
current=head;
int match=0;
printf("Hi");
while (*current !=NULL) {
printf("No");
if (strcmp((*current)->name,tempName)==0) {
printf("Name exists already");
match=1;
*current=(*current)->next;
}
}
printf("HI");

该函数甚至没有到达 printf("Good");陈述。感谢您的帮助!

编辑:这是所有代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define NODE struct node
struct node {
char name[20];
int number;
NODE *next;
};
int counter;

int putIn(NODE **head,NODE **current,NODE **prev);
int delete(NODE **head,NODE **current,NODE **prev);
int show(NODE **head,NODE **current,NODE **prev);
NODE *head=NULL;
NODE *current=NULL;
NODE *prev=NULL;
char tempName[40];
int main() {
int whileLoop=0;



while(whileLoop==0) {
printf("Enter A Command: (1)Insert Party (2)Delete Party (3)Show List (4)Quit: ");
int selection;
scanf("%d",&selection);

switch(selection) {
case 1:
putIn(&head,&current,&prev);
break;
case 2:
delete(&head,&current,&prev);
break;
case 3:
show(&head,&current,&prev);
break;
case 4:
whileLoop=1;
break;
default:
putIn(&head,&current,&prev);
}
}
return 0;
}
int putIn(NODE **head,NODE **current,NODE **prev) {
//char tempName[40];
printf("Enter party name: ");

scanf("%s",tempName);

printf("Good?");
current=head;
int match=0;
printf("Hi");
while (*current !=NULL) {
printf("No");
if (strcmp((*current)->name,tempName)==0) {
printf("Name exists already");
match=1;
*current=(*current)->next;
}
}
printf("HI");
current=(NODE **)malloc(sizeof(NODE *));
if (*head==NULL) {
head=current;
}
(*current)->next=NULL;
strcpy((*current)->name,tempName);
printf("enter party size: ");
scanf("%d",&(*current)->number);

prev=head;
int i;
for (i=0;i<counter-1;i++){
*prev=(*prev)->next;
}
if (counter!=0) {
(*prev)->next=*current;
}
printf("%d",(*head)->number);
counter+=1;
return 0;
}
int delete(NODE **head,NODE **current,NODE **prev) {
int openTable;
printf("Enter open table size: ");
scanf("%d",&openTable);
current=head;
int match=0;
int grow=0;
while (*current!=NULL) {
if ((*current)->number<=openTable) {
match=1;
printf("A table of %d has been removed",(*current)->number);
prev=head;
int i;
for (i=0;i<grow-1;i++) {
*prev=(*prev)->next;
}
(*prev)->next=(*current)->next;
free(*current);
counter-=1;
} else {
grow+=1;
*current=(*current)->next;
}
}
return 0;
}
int show(NODE **head,NODE **current,NODE **prev) {
if (head==NULL) {
printf("\nNo data entered");
}
else {
printf("\nHere is the waiting list: \n");
}
current=head;
while (*current !=NULL) {
printf("Name: %s Size: %d\n",(*current)->name,(*current)->number);
*current=(*current)->next;
}
return 0;
}

最佳答案

如果您没有输入太长的内容,则该问题与 scanf 无关。您的崩溃候选者是:

  while (*current != NULL) {

  if (strcmp((*current)->name, tempName) == 0) {

根据指向指针的指针的初始化状态,其中之一可能会导致段错误。

您必须在调用 putIn(...); 的位置提供函数调用的上下文

编辑:在深入了解逻辑后,出现以下错误:

你开始于:

NODE *head = NULL;
NODE *current = NULL;
NODE *prev = NULL;

并且,无需任何进一步的初始化,进入:

putIn(&head, &current, &prev);

您执行以下操作:

 ...
current = (NODE **)malloc(sizeof(NODE *));
...

这意味着,函数调用中的实际参数(一个重要的地址值,已复制到堆栈上)被malloc结果覆盖(这不可能是正确的,也许你的意思是*current = (NODE *) malloc(sizeof(NODE)); ... 或其他)。

在下一步中,您将使用已断开连接的 current 初始化(也断开连接)head:

 if (*head == NULL) {
head = current;
}

在下一行中,您取消引用分配的指针并访问它,因为它将指向一个结构 node (具有 NODE* 成员),该结构具有 到目前为止尚未分配...

(*current)->next = NULL;

哪个段错误(因为*current没有指向分配的结构node)。

关于c - C 中 scanf 的段错误。没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26514424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com