2015-12-02 2 views
1

Таким образом, у меня есть программа, которая берет строку данных и число на конце, которое является ее позицией в приоритете, которую нужно распечатать. Я должен использовать связанный список, и я выяснил, как это сделать с этим, однако способ, которым выполняется эта программа, находится в конце строк данных и приоритета, который пользователь должен ввести NONE и программа выполняет. Проблема в том, что мой чек с помощью strcmp заставляет пользователя дважды вводить NONE для выполнения программы. Я не думаю, что я правильно использую scanf для значений string и int, и вот где моя проблема, но я не уверен.Как scanf работает как с целыми, так и целыми? C

Вот правильный вход образец:

andk81739wewe 7 

qweod125632ao 3 

lenlc93012wasd 0 

093deaeiao12 5 

13jadacas291 3 

... 


NONE 

Вот что на самом деле должен быть набран в программе для выполнения

andk81739wewe 7 

qweod125632ao 3 

lenlc93012wasd 0 

093deaeiao12 5 

13jadacas291 3 

... 

NONE 

NONE 

Любые идеи относительно того, почему второй NONE не должен быть набран для чтобы признать, что никто не был введен?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define LARGE 100 

struct node 
{ 
    char data[LARGE]; 
    int position; 
    struct node* next; 
}; 


void sortedInsert(struct node** first, struct node* new_node) 
{ 
    struct node* current; 
    if (*first == NULL || (*first)->position <= new_node->position) 
    { 
     new_node->next = *first; 
     *first = new_node; 
    } 
    else 
    { 
     current = *first; 
     while (current->next!=NULL && 
       current->next->position > new_node->position) 
     { 
      current = current->next; 
     } 
     new_node->next = current->next; 
     current->next = new_node; 
    } 
} 


struct node *newNode(char *new_data,int position) 
{ 
    struct node* new_node = 
    (struct node*) malloc(sizeof(struct node)); 

    strcpy(new_node->data,new_data); 
    new_node->position=position; 
    new_node->next = NULL; 

    return new_node; 
} 

void printList(struct node *head) 
{ 
    struct node *temp = head; 
    while(temp != NULL) 
    { 
     printf("%s \n", temp->data); 
     temp = temp->next; 
    } 
} 

int main(void) { 

    char job[LARGE],blank[1]={' '},*p,*q; 
    int number=0,x=0; 
    q=&blank[1]; 
    struct node* first = NULL; 
    struct node *new_node = newNode(q,0); 
    printf("Please enter printing jobs\n"); 
    while(x!=1){ 
     if(strcmp(job,"NONE")==0){ 
      x=1; 
     } 
     else{ 
      scanf("%s", job); 
      scanf("%d", &number); 
      p=&job[0]; 
      sortedInsert(&first, new_node); 
      new_node = newNode(p,number); 
     } 
    } 
    printf("Print Job in order from 9-0\n"); 
    printList(first); 
    return 0; 
} 
+2

Вам нужно проверить 'strcmp' после первого' scanf' и перед вторым 'scanf'. В противном случае он читает «NONE», а затем пытается прочитать int. Int 'scanf' возвращает (и не работает), когда вы вводите что-то другое (второе NONE). Существуют и другие проблемы с вашим кодом. Например, 'job' не инициализируется при первом вызове' strcmp'. Кроме того, вы всегда должны проверять возвращаемое значение 'scanf' и следить за тем, чтобы он не переполнял буфер' job'. – kaylum

+0

Спасибо @kaylum за советы! Так должен ли я всегда инициализировать каждую переменную, когда создаю ее, а не оставляю ее так, как она есть? – Senglish

+0

@Senglish. Вы должны инициализировать переменную, прежде чем использовать ее. В противном случае вы получите неопределенное поведение. – niyasc

ответ

1

В качестве альтернативы вы можете использовать следующий сегмент кода. Этот более упрощенный и упрощенный подход.

int main(void) { 

    char job[LARGE]; 
    struct node *first = NULL; 
    struct node *new_node = NULL; 
    int number; 
    printf("Please enter printing jobs\n"); 
    while(1) 
    { 
     scanf("%s", job); 
     if(!strcmp(job, "NONE")) 
      break; 
     scanf("%d", &number); 

     new_node = newNode(job, number); 

     sortedInsert(&first, new_node); 
    } 

    printf("Print Job in order from 9-0\n"); 
    printList(first); 
    return 0; 
} 
+0

Это решение вызывает проблему, если есть два входа с одинаковым приоритетом. Он будет печатать первый, заданный пользователем, а не другой, например, если я делаю две строки данных с приоритетом 3, будет напечатан только один из них. – Senglish

+0

@ Сингл, я не понимаю, что вы имеете в виду по приоритету. – niyasc

+0

, поэтому во входной части моего исходного сообщения каждая введенная строка данных имеет номер в конце, который указывает приоритет, в котором должна быть распечатана строка данных. Если один из них, как и в моем примере, имеет одинаковый приоритет, то только из них печатаются, а не оба. – Senglish

Смежные вопросы