Таким образом, у меня есть программа, которая берет строку данных и число на конце, которое является ее позицией в приоритете, которую нужно распечатать. Я должен использовать связанный список, и я выяснил, как это сделать с этим, однако способ, которым выполняется эта программа, находится в конце строк данных и приоритета, который пользователь должен ввести 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;
}
Вам нужно проверить 'strcmp' после первого' scanf' и перед вторым 'scanf'. В противном случае он читает «NONE», а затем пытается прочитать int. Int 'scanf' возвращает (и не работает), когда вы вводите что-то другое (второе NONE). Существуют и другие проблемы с вашим кодом. Например, 'job' не инициализируется при первом вызове' strcmp'. Кроме того, вы всегда должны проверять возвращаемое значение 'scanf' и следить за тем, чтобы он не переполнял буфер' job'. – kaylum
Спасибо @kaylum за советы! Так должен ли я всегда инициализировать каждую переменную, когда создаю ее, а не оставляю ее так, как она есть? – Senglish
@Senglish. Вы должны инициализировать переменную, прежде чем использовать ее. В противном случае вы получите неопределенное поведение. – niyasc