我正在尝试从用户输入中读取变长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并尝试输入一个字符,程序也会崩溃。
我做错了什么?
答案 0 :(得分:1)
您必须指定value
到scanf_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
这是非常恼人的...