проверка массивов символов в C ++ - PullRequest
3 голосов
/ 06 января 2020

Я должен проверить мои данные " 123-AB-12345 " как правильные, используя массив символов. Я установил размер массива char в 13, включая '\ 0'. Функция должна возвращать false, если условие не выполняется. Все, что я сделал, - это то, что программа проверяет эти 12 символов, но ОНО НЕ ВОЗВРАЩАЕТСЯ, КОГДА Я ПРОШЕЛ БОЛЬШЕ ЗНАЧЕНИЙ, например, « 123-AB-12345 6789», и оно возвращает значение true. Моя программа выглядит следующим образом:

#include<iostream>
using namespace std;
bool isValidBookId(char bookId[13]);
int main()
{
    char book[13];
    cin.getline(book,13);
    bool id = isValidBookId(book);
    cout<<id;
}
bool isValidBookId( char bookId[13] ) {
    /* Valid:  098-EN-98712   */
    if ( bookId[12] != '\0' )
        return false;
    if ( bookId[3] != '-' )
        return false;
    if ( bookId[6] != '-' )
        return false;

    for ( int i = 0; i < 3; i++ ) {
        if ( bookId[i] < '0' || bookId[i] > '9' ) {
            return false;
        }
    }
    for ( int i = 4; i < 6; i++ ) {
        if ( bookId[i] < 'A' || bookId[i] > 'Z' ) {
            return false;
        }
    }
    for ( int i = 7; i < 12 || bookId[12]!='\0'; i++ ) {
        if(bookId[13]!='\0'){
            return false;
        }
        if ( bookId[i] < '0' || bookId[i] > '9' ) {
            return false;
        }
    }

    return true;
}

Я не знаю, почему это условие не работает.

 if ( bookId[12] != '\0' )
        return false;

Ответы [ 4 ]

2 голосов
/ 06 января 2020

Глядя на ваш код, единственное объяснение состоит в том, что последний символ вашего массива равен нулю. Попробуйте указать символ-разделитель следующим образом:

cin.getline(book, 13, '\n');

Я бы сослался на эту ссылку :

"Нулевой символ ('\ 0') добавляется автоматически в записанную последовательность, если n больше нуля, даже если извлечена пустая строка. "

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

Все условия верны. Ваша проблема создается изначально при вводе данных.

cin.getline(book,13);

Метод 'getline' принимает любое количество символов (конечно, в пределах разумного), но выделяет место только для первых 12 символов, а 13-й всегда будет только '\ 0'. Если вы хотите написать больше символов, позвольте мне ввести больше символов.

Правильный вариант:

bool isValidBookId(char bookId[100]); // now there is a restriction of not 13 characters, but 100
int main()
{
    char book[100]; // now there is a restriction of not 13 characters, but 100 
    cin.getline(book,100); // now there is a restriction of not 13 characters, but 100
}
bool isValidBookId( char bookId[100] ) // now there is a restriction of not 13 characters, but 100
{...}
1 голос
/ 06 января 2020

Ваша проблема в функции ввода:

Вы прочитали только до 12 символов. Таким образом, вы не можете иметь более 12 символов.

Вы можете использовать std::string

bool isValidBookId(const std::string&s) {
    static const std::regex r{R"(^\d{3}-[A-Z]{2}-\d{5}$)"};

    return std::regex_match(std::begin(s), std::end(s), r);
}

int main()
{
    std::string s;

    while (std::getline(std::cin, s))
    {
        std::cout << s << ": " << isValidBookId(s) << std::endl;
    }
}

Демо

или больший буфер:

bool isValidBookId(const char (&s)[14]) {
    static const std::regex r{R"(^\d{3}-[A-Z]{2}-\d{5}\0$)"};

    return std::regex_match(std::begin(s), std::end(s) - 1, r);
}

int main()
{
    char s[14];

    while (true)
    {
        bool b = !!std::cin.getline(s, 14);
        if (s[0] == '\0') break;
        std::cout << " " << s << ": " << isValidBookId(s) << std::endl;
        if (!b) {
            std::cin.clear();
            std::cin.ignore(255, '\n');
        }
    }
}

Демо

0 голосов
/ 06 января 2020

Как указано выше,

cin.getline (book, 13) не сохранит более 12 символов в вашем массиве. Вместо этого замените ваш код на:

char book[100]; // To save upto 99 characters
cin.getline(book,100);

И измените

isValidBookId(char bookId[13])

на

isValidBookId( char bookId[100] )

и удалите все проверки bookId [12]! = '\ 0 'внутри этой функции isValidBookId, поскольку в 12-м индексе может быть любой символ.

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