VC ++ чтение переменной длины char * - PullRequest
1 голос
/ 18 февраля 2011

Я пытаюсь прочитать переменную длину char * из пользовательского ввода. Я хочу иметь возможность указать длину строки для чтения при вызове функции;

char *get_char(char *message, unsigned int size) {
    bool correct = false;
    char *value = (char*)calloc(size+1, sizeof(char));
    cout << message;

    while(!correct) {
        int control = scanf_s("%s", value);
        if (control == 1)
            correct = true;
        else
            cout << "Enter a correct value!" <<endl
                << message;

        while(cin.get() != '\n');
    }

    return value;
}

Итак, после запуска программы и попытки ввода строки я получил нарушение доступа к памяти, поэтому я решил, что что-то пошло не так при доступе к выделенному пространству. Моя первая идея заключалась в том, что это пошло не так, потому что размер отсканированного символа * не указан в scanf (), но он также не работает со строками правильной длины. Даже если я предоставлю calloc размер 1000 и попытаюсь ввести один символ, программа вылетает.

Что я сделал не так?

1 Ответ

1 голос
/ 18 февраля 2011

Вы должны указать размер от value до scanf_s:

int control = scanf_s("%s", value, size);

делает свое дело.

См. документацию из scanf_s для примера использования этой функции:

В отличие от scanf и wscanf, scanf_s и wscanf_s требуют указания размера буфера для всех входных параметров типа c , C , s , S или [. Размер буфера передается в качестве дополнительного параметра сразу после указателя на буфер или переменную .

Я опускаю здесь остальную часть описания MSDN, потому что в приведенном ими примере они используют scanf вместо scanf_s, что довольно раздражает ...

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