Scanf не принимает входные данные - PullRequest
1 голос
/ 05 января 2020
string name,date,dateOfBirth,address,phoneNumber;
int age;
int citizenshipNumber,accountNumber,choiceForMenu;
float amount;
void createAccount(){
    system("cls");
    cout<< setw(40);
    cout<< "ADD RECORD"<<endl;
    cout<<endl;
    printf("Enter today's date(mm/dd/yyyy):");
    scanf("%s" , &date);
    printf("Enter the name:");
    scanf("%s", &name);
    printf("Enter the date of birth(mm/dd/yyyy):");
    scanf("%s" , &dateOfBirth);
    printf("Enter the age:");
    scanf("%d",&age);
    printf("Enter the address:");
    scanf("%s", &address);
    printf("Enter the citizenship number:");
    scanf("%d", &citizenshipNumber);
    printf("Enter the phone number:");
    scanf("%s", &phoneNumber);
    printf("Enter the amount of deposit:");
    scanf("%f", &amount);

    system("pause");
}

После того, как я введу адрес, номер гражданства, номер телефона и сумма депозита окажутся в одной строке и не позволят мне что-либо вводить, поэтому любой может помочь мне решить эту проблему. Спасибо!

Ответы [ 2 ]

1 голос
/ 05 января 2020

Ваш код имеет неопределенное поведение, так как вы не можете использовать scanf для чтения в std :: string, но проблема, о которой вы сообщаете, вероятно, не зависит от этого.

Когда вы читаете "строку" ( либо scanf("%s", ... или cin >> var, где var - это std::string), вы читаете токен с разделителями, а НЕ строку. Вызов прекратит чтение, как только увидит пробел или табуляцию (или что-либо еще, определенное как пробел в текущей локали) после прочтения хотя бы одного непробельного символа. Поэтому, если вы введете строку с пробелами (например, ваш адрес содержит хотя бы один пробел), он остановится на этом пробеле и оставит остальную часть строки для чтения при будущих вызовах scanf или cin >>. В результате вы увидите, что все ваши следующие запросы накапливаются в одной строке, так как код читает остальную часть адресной строки как то, что вы читаете, вместо того, чтобы ждать больше строк ввода.

Если вы хотите прочитать строки ввода (вместо текста, разделенного пробелами), вы должны использовать fgets (C) или getline (POSIX C или C ++)

1 голос
/ 05 января 2020

Вы не можете использовать scanf с параметром std :: string таким образом. Если вы хотите, вы можете попробовать:

std::string str(50, ' ');
if ( scanf("%*s", &str[0], str.size()) == 1) {
    // ...
}

Если вы компилируете с c ++ 17, вы можете попробовать использовать data ().

Но в целом это не лучшие решения. В общем, scanf не принимает ни один класс C ++.

. Я предлагаю вам использовать методы C ++ при использовании C ++, чтобы избежать этой ошибки. Например, std :: cin может быть решением.

...