Как составить серию вопросов? - PullRequest
0 голосов
/ 05 мая 2020

Вот мой код. Я хочу, чтобы он задавал мне вопросы по порядку. Но всякий раз, когда я вводил свой выбор и указывал свое имя, это не позволяло мне спрашивать больше. Как с этим бороться?

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

int new_acc();

int main(){

    int one=1, two=2, three=3, four=4, five=5, six=6, seven=7, new_account;

    printf("-----WELCOME TO THE MAIN MENU-----\n\n");

    printf("%d. Create new account\n",one);

    printf("Enter you choice: ");
    if (scanf("%d",&one)){
        new_account = new_acc(); // calling a function
    }
    return 0;
}

int new_acc(){
    int id; char name;

    printf("Enter your name: ");
    scanf("%c\n",&name);

    printf("Enter your ID card number: ");
    scanf("%d\n",&id);    

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Если вы набрали Enter после ввода nubmer для ГЛАВНОГО МЕНЮ, символ новой строки останется в буфере.
Затем он читается как имя через %c.
После этого, если вы набрали, для Например, алфавит в качестве имени, это предотвратит чтение числа id.
Чтобы избежать этого, вы можете поставить пробел перед %c, чтобы он пропустил символ новой строки.
Также вы не будете необходимо пропустить после чтения имени и идентификатора, поэтому вы должны удалить \n в scanf() после %c и %d для них.

int new_acc(){
    int id; char name;

    printf("Enter your name: ");
    scanf(" %c",&name); /* add space and remove \n */

    printf("Enter your ID card number: ");
    scanf("%d",&id);    /* remove \n */

    return 0;
}

Кстати, приведенный выше код позволит только один алфавит в качестве имени. Для поддержки многосимвольного имени (без пробела) вы должны использовать массив char и %s с указанной длиной.

int new_acc(){
    int id; char name[1024];

    printf("Enter your name: ");
    scanf(" %1023s",name); /* don't use & here, and size limit is buffer size - 1 (-1 for terminating null character) */

    printf("Enter your ID card number: ");
    scanf("%d",&id);    

    return 0;
}

Если вы хотите поддерживать имя с пробелами, вы можете используйте %[\n] (читать до символа новой строки) вместо %s.

int new_acc(){
    int id; char name[1024];

    printf("Enter your name: ");
    scanf(" %1023[^\n]",name);

    printf("Enter your ID card number: ");
    scanf("%d",&id);    

    return 0;
}
0 голосов
/ 05 мая 2020

Похоже, вы хотите использовать здесь парадигму объектно-ориентированного программирования. Для этого вы должны определить «объект» с помощью struct и сохранить новую учетную запись с этим:

#define MAX 50

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

struct Account {
        int id;
        char name[MAX];
};

struct Account new_acc();

int main(){

        int choice;
        struct Account new_account;

        printf("-----WELCOME TO THE MAIN MENU-----\n\n");
        printf("1. Create new account\n");
        printf("Enter you choice: ");
        scanf("%d",&choice);
        switch(choice) {
                case 1:
                        new_account = new_acc();
                        break;
                default:
                        printf("Not a valid option\n");
                        return 1;
        }

        return 0;
}

struct Account new_acc(){

        char name[MAX];
        int id;
        struct Account new;

        printf("Enter your name: ");
        scanf("%c\n",name);

        printf("Enter your ID card number: ");
        scanf("%d\n",&id);    

        strcpy(new.name, name);
        new.id = id;

        return new;
}

Обратите внимание, потому что этот код очень уязвим для переполнения буфера. Кроме того, я отредактировал ваш чек для параметра в main, потому что scanf возвращает 1, если какое-либо значение успешно прочитано.

0 голосов
/ 05 мая 2020

Используйте этот код, который я немного изменил

int new_acc(){
    int id; char name[10];

    printf("Enter your name: ");
    scanf("%s",name);

    printf("Enter your ID card number: ");
    scanf("%d",&id);    
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...