VC ++读取变长char *

时间:2011-02-18 12:09:49

标签: visual-c++ pointers memory-management

我正在尝试从用户输入中读取变长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;
}

因此,在运行程序并尝试输入字符串时,我得到了内存访问冲突,因此我认为在访问分配的空间时出现了问题。我的第一个想法是它出错了,因为扫描的char *的大小没有在scanf()中指定,但它也不适用于正确的长度字符串。即使我将calloc的大小设置为1000并尝试输入一个字符,程序也会崩溃。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您必须指定valuescanf_s的尺寸:

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

诀窍。

有关如何使用该功能的示例,请参阅scanf_s的{​​{3}}:

  

与scanf和wscanf不同, scanf_s wscanf_s 要求为 c <类型的所有输入参数指定缓冲区大小 / strong>, C s S [缓冲区大小在指向缓冲区或变量的指针后立即作为附加参数传递。

我在这里省略了其余的MSDN描述,因为在他们提供的示例中,他们使用scanf而不是scanf_s这是非常恼人的...