2015-02-08 59 views
0

我的文本文件讀取這樣的:插入姓名和電話號碼,以鏈接列表的末尾

George Washington, 2345678 
John Adams, 3456789 
Thomas Jefferson, 4567890 
James Madison, 0987654 
James Monroe, 9876543 
John Quincy Adams, 8765432 
Andrew Jackson, 7654321 
Martin Van Buren,

有人能提供我如何得到我的插入功能的姓名和身份證號碼添加到年底的洞察力鏈表?當我運行代碼時,選擇選項1會跳過添加名稱,只會要求輸入整數。之後沒有任何反應。

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

//Creates node for holding student's information 
struct node 
{ 
    char name [50]; 
    int id; 
    struct node *next; 
}*head; 

//Create Function Prototypes 
void readDataFile(); 
void insert(char *inName, char *inID); 
void display(struct node *d); 
int deleteID(int num); 
void deleteName(char dname); 


//Main function 
int main() 
{ 
    //Declare variables 
    int i, num, id; 
    char *name; 
    char nameDelete [50]; 
    char nameInsert [50]; 
    struct node *n; 

    //initialize link list 
    head = NULL; 

    //Read in file 
    readDataFile(); 

    //Create list of operations utilized in program 
    while (1) 
    { 
     printf("\nList Operations\n"); 
     printf("===============\n"); 
     printf("1.Insert\n"); 
     printf("2.Display\n"); 
     printf("3.Delete by ID\n"); 
     printf("4.Delete by Name\n"); 
     printf("5.Exit\n"); 
     printf("Enter your choice : "); 

     if(scanf("%d", &i) <= 0) 
     { 
      printf("Enter only an Integer\n"); 
      exit(0); 
     } 
     else 
     { 
      switch(i) 
      { 
       case 1: 
        printf("Enter the name to insert:\n"); 
        scanf("%[^\n]s", nameInsert); 
        getchar(); 
        printf("Enter the ID associated with the name: "); 
        scanf("%d", &id); 
        insert(nameInsert, id); 
        break; 
       case 2: 
        if (head == NULL) 
         printf("List is Empty\n"); 
        else 
        { 
         printf("Elements in the list are:\n"); 
        } 
        display(n); 
        break; 
       case 3: 
        if(head == NULL) 
         printf("List is Empty\n"); 
        else 
        { 
         printf("Enter the ID number to delete: "); 
         scanf("%d", &id); 
        } 

        if(deleteID(id)) 
         printf("%d deleted successfully \n", id); 
        else 
         printf("%d not found in the list\n", id); 
        break; 
       case 4: 
        if(head == NULL) 
         printf("List is Empty\n"); 
        else 
        { 
         printf("Enter name to delete: "); 
         gets(nameDelete); 
        } 
       case 5: 
        return 0; 
       default: 
        printf("Invalid option\n"); 
      } 
     } 
    } 
    return 0; 
} 

//Define the functions 
//Function to read in the data file 
void readDataFile() 
{ 
    //Initialize the link the list 
    struct node *temp; 
    temp = malloc(sizeof(struct node)); 
    temp->next = NULL; 
    head = temp; 

    //Open up the file 
    FILE *fp; 
    fp = fopen("AssignmentOneInput.txt", "r"); 

    //Use memset function to copy the characters in string 
    char string[100]; 
    memset(string, 0, 100); 

    //Create while loop scan in the contents of the file 
    while(fgets(string, 100, fp) != NULL) 
     { 
     sscanf(string, "%20[^,], %d", temp->name, &temp->id); 
     temp->next = malloc(sizeof(struct node)); 
     temp = temp->next; 
     temp->next = NULL; 

     } 
     fclose(fp); 
} 

//Function to insert a name and ID number 
void insert(char *inName, char *inID) 
{ 
    //Create temporary and helper nodes 
    struct node *temp, *helper; 

    //Allocate the memory for the temporary node 
    temp = (struct node *)malloc(sizeof(struct node)); 

    //Convert character into integer value 
    int intID = atoi(inID); 

    //Set the data in the node 
    strcpy(temp->name, inName); 
    temp->id = intID; 
    temp->next = NULL; 

    //Create new node and add to it 
    helper = (struct node *)head; 

    while(helper->next != NULL) 
    { 
     helper = helper->next; 
    } 

    helper->next = temp; 
    helper = temp; 
    helper->next = NULL; 
} 
+0

'insert()'有什麼問題? – Inspired 2015-02-08 22:54:39

+1

它甚至編譯? 'insert'期望第二個參數是'char *',但是你在那裏傳遞'int' ... – Inspired 2015-02-08 22:59:28

+0

@Inspired這就是我想要弄明白的。當它運行並編譯時,它會跳過添加名稱部分,並要求與名稱關聯的int – Beginner 2015-02-08 23:05:33

回答

0

一旦你選擇選項中輸入1標準輸入既有1和換行符,你在接下來的scanf聲明立即期待。

scanf("%[^\n]s", nameInsert);更改爲scanf("%s", nameInsert); 或在獲得選擇選項後立即使用getchar()

+0

既然目標是讓名字像'喬治華盛頓'進入(名稱中有一個空格), scan-set是一個好主意,但格式化字符串應該在它之前有一個空格(但不要在它之後),以便吃掉任何前導空格,例如前一個條目留下的換行符。因此:'if(scanf(「%49 [^ \ n]」,nameInsert)!= 1){...處理EOF ...}'。掃描集本身就是一個轉換說明符。這是一個常見的錯誤之後的's'。在這種情況下,它幾乎是無害的(它不能匹配換行符,但'scanf()'沒有辦法報告這個失敗),但在其他情況下可能會破壞你的I/O。 – 2015-02-09 15:34:42