在 C 中,为什么尽管在代码中提到了链表节点内的 scanf 输入,但我没有被采用?


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define MAX 30
struct EMP {
int empno;
char empName[MAX];
char designation[MAX];
struct EMP *next;
};
/*********************************************************************/
/* Function to insert a node at the front of the linked list.        */
/* front: front pointer, id: employee ID, name: employee name        */
/* desg: Employee designation                                        */
/* Returns the new front pointer.                                    */
/*********************************************************************/
struct EMP *insert(struct EMP *front, int id, char name[], char desg[])
{
struct EMP *newnode;
newnode = (struct EMP *)malloc(sizeof(struct EMP));
if (newnode == NULL) {
printf("nAllocation failedn");
exit(2);
}
newnode->empno = id;
strcpy(newnode->empName, name);
strcpy(newnode->designation, desg);
newnode->next = front;
front = newnode;
return (front);
}                               /* End of insert() */
/* Function to display a node in a linked list */
void printNode(struct EMP *p)
{
printf("nEmployee Details...n");
printf("nEmp No : %d", p->empno);
printf("nName : %s", p->empName);
printf("nDesignation : %sn", p->designation);
printf("-------------------------------------n");
}                               /* End of printNode() */
/* ******************************************************* */
/* Function to deleteNode a node based on employee number */
/* front: front pointer, id: Key value */
/* Returns: the modified list. */
/* ******************************************************* */
struct EMP *deleteNode(struct EMP *front, int id)
{
struct EMP *ptr;
struct EMP *bptr;           /* bptr is pointing to the node behind ptr */
if (front->empno == id) {
ptr = front;
printf("nNode deleted:");
printNode(front);
front = front->next;
free(ptr);
return (front);
}
for (ptr = front->next, bptr = front; ptr != NULL; ptr = ptr->next, bptr = bptr->next) {
if (ptr->empno == id) {
printf("nNode deleted:");
printNode(ptr);
bptr->next = ptr->next;
free(ptr);
return (front);
}
}
printf("nEmployee Number %d not found ", id);
return (front);
}                               /* End of deleteNode() */
/*****************************************************************/
/* Function to search the nodes in a linear fashion based emp ID */
/* front: front pointer, key: key ID. */
/*****************************************************************/
void search(struct EMP *front, int key)
{
struct EMP *ptr;
for (ptr = front; ptr != NULL; ptr = ptr->next) {
if (ptr->empno == key) {
printf("nKey found:");
printNode(ptr);
return;
}
}
printf("nEmployee Number %d not found ", key);
}                               /* End of search() */
/* Function to display the linked list */
void display(struct EMP *front)
{
struct EMP *ptr;
for (ptr = front; ptr != NULL; ptr = ptr->next) {
printNode(ptr);
}
}                               /* End of display() */
/* Function to display the menu of operations on a linked list */
void menu()
{
printf("---------------------------------------------n");
printf("Press 1 to INSERT a node into the list n");
printf("Press 2 to DELETE a node from the list n");
printf("Press 3 to DISPLAY the list n");
printf("Press 4 to SEARCH the list n");
printf("Press 5 to EXIT n");
printf("---------------------------------------------n");
}                               /* End of menu() */
/* Function to select the option */
char option()
{
char choice;
printf("nn>> Enter your choice: ");
switch (choice = getche()) {
case '1':
case '2':
case '3':
case '4':
case '5':
return (choice);
default:
printf("nInvalid choice.");
}
return choice;
}                               /* End of option() */
/* The main() program begins */
void main()
{
struct EMP *linkList;
char name[21], desig[51];
char choice;
int eno;
linkList = NULL;
printf("nWelcome to demonstration of singly linked listn");
menu();                     /* Function call */
do {
choice = option();      /* to choose oeration to be performed */
switch (choice) {
case '1':
printf("nEnter the Employee Number : ");
scanf("%d", &eno);
printf("Enter the Employee name : ");
fflush(stdin);
gets(name);
printf("Enter the Employee Designation : ");
gets(desig);
linkList = insert(linkList, eno, name, desig);
break;
case '2':
printf("nnEnter the employee number to be deleted: ");
scanf("%d", &eno);
linkList = deleteNode(linkList, eno);
break;
case '3':
if (linkList == NULL) {
printf("nList empty.");
break;
}
display(linkList);
break;
case '4':
printf("nnEnter the employee number to be searched: ");
scanf("%d", &eno);
search(linkList, eno);
break;
case '5':
break;
}
} while (choice != '5');
}                               /* End of main() */

但是,当我运行程序时,程序不接受员工姓名的值,而是直接跳转到员工名称。

正如您在链接的输出屏幕截图中看到的那样,它直接跳转到员工名称,而无需输入员工姓名

为什么会这样?

编辑1:我被告知尝试用"fgets"替换"gets"。尽管如此,计算机现在仍然输入员工姓名并直接跳转到员工名称。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define MAX 30
struct EMP
{
int empno;
char empName[MAX];
char designation[MAX];
struct EMP *next;
};
/*********************************************************************/
/* Function to insert a node at the front of the linked list. */
/* front: front pointer, id: employee ID, name: employee name */
/* desg: Employee designation */
/* Returns the new front pointer. */
/*********************************************************************/
struct EMP* insert(struct EMP *front, int id, char name[], char desg[])
{
struct EMP *newnode;
newnode = (struct EMP*) malloc(sizeof(struct EMP));
if (newnode == NULL)
{
printf("nAllocation failedn");
exit(2);
}
newnode->empno = id;
strcpy(newnode->empName, name);
strcpy(newnode->designation, desg);
newnode->next = front;
front = newnode;
return(front);
} /*End of insert() */
/* Function to display a node in a linked list */
void printNode(struct EMP *p)
{
printf("nEmployee Details...n");
printf("nEmp No : %d", p->empno);
printf("nName : %s", p->empName);
printf("nDesignation : %sn", p->designation);
printf("-------------------------------------n");
} /*End of printNode() */
/* ********************************************************/
/* Function to deleteNode a node based on employee number */
/* front: front pointer, id: Key value */
/* Returns: the modified list. */
/* ********************************************************/
struct EMP* deleteNode(struct EMP *front, int id)
{
struct EMP *ptr;
struct EMP *bptr; /* bptr is pointing to the node behind ptr */
if (front->empno == id)
{
ptr = front;
printf("nNode deleted:");
printNode(front);
front = front->next;
free(ptr);
return(front);
}
for(ptr=front->next, bptr=front; ptr!=NULL; ptr=ptr->next, bptr=bptr->next)
{
if (ptr->empno == id)
{
printf("nNode deleted:");
printNode(ptr);
bptr->next = ptr->next;
free(ptr);
return(front);
}
}
printf("nEmployee Number %d not found ", id);
return(front);
} /*End of deleteNode() */
/*****************************************************************/
/* Function to search the nodes in a linear fashion based emp ID */
/* front: front pointer, key: key ID. */
/*****************************************************************/
void search(struct EMP *front, int key)
{
struct EMP *ptr;
for (ptr = front; ptr != NULL; ptr = ptr -> next)
{
if (ptr->empno == key)
{
printf("nKey found:");
printNode(ptr);
return;
}
}
printf("nEmployee Number %d not found ", key);
} /*End of search() */
/* Function to display the linked list */
void display(struct EMP *front)
{
struct EMP *ptr;
for (ptr = front; ptr != NULL; ptr = ptr->next)
{
printNode(ptr);
}
} /*End of display() */
/* Function to display the menu of operations on a linked list */
void menu()
{
printf("---------------------------------------------n");
printf("Press 1 to INSERT a node into the list n");
printf("Press 2 to DELETE a node from the list n");
printf("Press 3 to DISPLAY the list n");
printf("Press 4 to SEARCH the list n");
printf("Press 5 to EXIT n");
printf("---------------------------------------------n");
} /*End of menu() */
/* Function to select the option */
char option()
{
char choice;
printf("nn>> Enter your choice: ");
switch(choice=getche())
{
case '1':
case '2':
case '3':
case '4':
case '5': return(choice);
default : printf("nInvalid choice.");
}
return choice;
} /*End of option() */
/* The main() program begins */
void main()
{
struct EMP *linkList;
char name[21], desig[51];
char choice;
int eno;
linkList = NULL;
printf("nWelcome to demonstration of singly linked listn");
menu(); /*Function call */
do {
choice = option(); /*to choose oeration to be performed */
switch(choice)
{
case '1':
printf("nEnter the Employee Number : ");
scanf("%d", &eno);
printf("Enter the Employee name : ");
//fflush(stdin);
fgets(name,MAX,stdin);

printf("Enter the Employee Designation : ");
fgets(desig,MAX,stdin);
linkList = insert(linkList, eno, name, desig);
break;
case '2': printf("nnEnter the employee number to be deleted: ");
scanf("%d", &eno);
linkList = deleteNode(linkList, eno);
break;
case '3': if (linkList == NULL)
{
printf("nList empty.");
break;
}
display(linkList);
break;
case '4': printf("nnEnter the employee number to be searched: ");
scanf("%d", &eno);
search(linkList, eno);
break;
case '5': break;
}
} while (choice != '5');
} /*End fo main()*/

标题中问题的答案

不进行输入,因为您正在混合scanf获取函数系列。scanf将换行符保留在缓冲区中,然后在调用fgets获取新行时,fgets找到一个新行作为第一个字符并立即返回。

建议

仅选择*get*族中的一个,*scanf*族来处理您的输入。您仍然可以使用fgets获取输入,然后将其传递给sscanf,以处理格式并检索值。

do {
choice = option();      /* to choose oeration to be performed */
char line_buffer[128];  // Declare your own line buffer
setbuf(stdin, NULL);  // Set stdin to unbuffered
switch (choice) {
case '1':
printf("nEnter the Employee Number : ");
// put input into line buffer
fgets(line_buffer, sizeof(line_buffer), stdin); 
// use sscanf on your line_buffer instead of stdin
sscanf(line_buffer, "%d", &eno); 
printf("Enter the Employee name : ");
fgets(name, sizeof(name), stdin);
printf("Enter the Employee Designation : ");
fgets(desig, sizeof(desig), stdin);
linkList = insert(linkList, eno, name, desig);
break;
// ...

这里的问题是当您使用gets()进行输入时n处于缓冲区stdin中。gets()读取stdin(如果未指定缓冲区(缓冲区,直到n

一个天真的解决方案是读取一个额外的字符,这会吞噬n. 这个想法是,您可以在使用scanf()从缓冲区使用n后使用以下任何一项,

  1. gets();
  2. getc(stdin);
  3. getchar();

相关内容

  • 没有找到相关文章

最新更新