Не NULL Пользовательский ввод - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь понять всю концепцию указателей, структур и т. Д., Поэтому я создал программу, которая получает пользовательский ввод для двух разных книг, а затем обменивается информацией о двух книгах. У меня не было никаких проблем с этим, однако возникла проблема - когда я нажимал ввод , название книги было бы совершенно пустым, и на выходе я, конечно, видел пустое место. Моя проблема в том, как я могу ограничить пользователя вводить любые буквы (A-Z, a-z), а не пробел?

Строка символов при вводе в массив, они сохраняются в последовательных адресах памяти. Мы также знаем, что 'NULL' представляется как '\ 0' в массивах.

Имея в виду все вышесказанное, я провел несколько тестов, в которых ALL из них не дали желаемых результатов.

Ниже приведены некоторые попытки, которые я предпринял.

1-я попытка

while (pBook1->name[0] == '\0')
{
    printf("\n Please enter a valid book name: ");
    fgets(pBook1->name, MAX, stdin);
}

2-я попытка

while (strcmp(pBook1->name, ""))
{
    printf("\n Please enter a valid book name: ");
    fgets(pBook1->name, MAX, stdin);
}

Кроме того, рассмотрите следующий код как исходный код моей программы:

#include <stdio.h>
#include <string.h>
#define MAX 50

struct Books
{
    char name[MAX];
    int ID;
    float price;
};

void swap(struct Books *, struct Books *);

void main()
{

    struct Books Book1, Book2, *pBook1, *pBook2;

    pBook1 = &Book1;
    pBook2 = &Book2;

    // Input for the 1st book
    printf("\n 1st Book \n ------------------------------");
    printf("\n Enter the name: ");
    fgets(pBook1->name, MAX, stdin);
    while (pBook1->name[0] == '\0')
    {
        printf("\n Please enter a valid book name: ");
        fgets(pBook1->name, MAX, stdin);
    }
    printf("\n Enter the ID: ");
    scanf("%d", &pBook1->ID);
    printf("\n Enter the price: ");
    scanf("%f", &pBook1->price);

    // Input for the 2nd book
    printf("\n 2nd Book \n ------------------------------");
    printf("\n Enter the name: ");
    fgets(pBook2->name, MAX, stdin);
    while (pBook2->name[0] == '\0')
    {
        printf("\n Please enter a valid book name: ");
        fgets(pBook2->name, MAX, stdin);
    }
    printf("\n Enter the ID: ");
    scanf("%d", &pBook2->ID);
    printf("\n Enter the price: ");
    scanf("%f", &pBook2->price);

    printf("\n Let's swap the info of the two books...");

    swap(pBook1, pBook2);

    printf("\n The info of the two books is now:");

    printf("\n------------------------------ \n 1st Book \n ------------------------------------");
    printf("\n Name \t\t ID \t Price \n %s \t\t %d \t %f", pBook1->name, pBook1->ID, pBook1->price);

    printf("\n------------------------------ \n 2nd Book \n ------------------------------------");
    printf("Name \t\t ID \t Price \n %s \t\t %d \t %f", pBook2->name, pBook2->ID, pBook2->price);
}

 void swap(struct Books *pB1, struct Books *pB2)
 {
   char temp[MAX];

   strcpy(temp, pB1->name);
   strcpy(pB1->name, pB2->name);
   strcpy(pB2->name, temp);

   int tempID = pB1->ID, tempPrice = pB1->price;

   pB1->ID = pB2->ID;
   pB2->ID = tempID;

   pB1->price = pB2->price;
   pB2->price = tempPrice;
 }

Ответы [ 2 ]

0 голосов
/ 23 января 2019

При нажатии введите pBook1->name[0] станет \n.Вы можете использовать некоторые функции как strlen, чтобы быть уверенным в названии.

0 голосов
/ 23 января 2019

fgets считывает, пока не встретит прочитанные байты EOF, \n или N-1.Поэтому, если пользователь вашей программы нажимает ввод, он будет читать \n и останавливаться.Что означает, что pBook1->name[0] == '\n'.Вот почему ваша проверка на равенство с "" терпит неудачу и почему pBook1->name[0] == '\0' терпит неудачу.

См. Этот пример .

Это означает, что вам нужно проверить на \n и \0 в случае, если пользователь ввел Ctrl-D, то есть, как вы вводите EOF в * nix системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...