C++ 如何读取C+中长度可变的格式字符串+;从stdin?
很抱歉问了这么愚蠢的问题,但我找不到任何明显的答案 我需要先从C++ 如何读取C+中长度可变的格式字符串+;从stdin?,c++,io,C++,Io,很抱歉问了这么愚蠢的问题,但我找不到任何明显的答案 我需要先从stdin读取数组大小的intn,然后从带有n元素的格式为“1 2 3 4 5 6”的字符串中读取整数值 如果我知道编译时的参数数量,我可以使用类似于scanf(或安全替代品)的格式字符串,如%d%d%d%d%d“,但这里我只知道运行时的值 在C++中,最好的方法是什么?性能很重要,但比安全更重要
stdin
读取数组大小的int
n
,然后从带有n
元素的格式为“1 2 3 4 5 6”的字符串中读取整数值
如果我知道编译时的参数数量,我可以使用类似于scanf
(或安全替代品)的格式字符串,如%d%d%d%d%d“
,但这里我只知道运行时的值
<>在C++中,最好的方法是什么?性能很重要,但比安全更重要
<如何从STDIN?中读取C++中可变长度的格式字符串?
你不应该试图做这种事。仅使用常量格式字符串
我需要先从stdin读取数组大小的int n,然后读取整数值
在C++中最好的方法是什么?
一次读取一个值。使用循环重复此操作。这里有一个函数,它执行errorika所描述的操作:
const int SIZE = //as much of your memory as you'd like the user to have access to
***caller function must include this:
//allocate a string to hold some data;
char* buffer = NULL;
buffer = malloc (SIZE * sizeof(char));
if (buffer == NULL) {
printf("malloc error terminating\n");
return;
}
***
void getEntry(char* buffer) {
int count = 0;
int maxlen = SIZE - 1;
char a = '0';
for (int i = 0; i < SIZE; i++) {
buffer[i] = '0';
}
while (a != '\n' && count < maxlen) {
a = fgetc(stdin);
buffer[count] = a;
count++;
}
if (a == '\n') {
buffer[count - 1] = '\0';
}
else {
buffer[count] = '\0';
do {
a = fgetc(stdin);
} while (a != '\n');
}
}
const int SIZE=//您希望用户能够访问的内存量
***调用方函数必须包括以下内容:
//分配一个字符串来保存一些数据;
char*buffer=NULL;
缓冲区=malloc(大小*sizeof(字符));
if(buffer==NULL){
printf(“malloc错误终止\n”);
返回;
}
***
void getEntry(字符*缓冲区){
整数计数=0;
int maxlen=大小-1;
字符a='0';
对于(int i=0;i
这是所有基本的C代码,但用户输入是邪恶的。这里是我提出的C++更多的惯用用户输入函数(查询只是传入的消息字符串):
模板
void getInput(const std::字符串查询、T和entry){
std::字符串输入;
std::cout条目;
}
或
模板
void getInput2(标准::字符串查询,T和输入){
布尔有效输入=假;
while(validInput==false)
{
validInput=true;
std::cout条目;
if(std::cin.fail()){
validInput=假;
STD::打开C++ C++,解释如何使用<代码> STD::GETLION<代码>:STRIGSWATS,并阅读它。<代码> SCANF< <代码>,格式字符串是C,而现代C++应该使用类型安全>代码> STD::GETLION<代码>和代码> STD::ISTIGSTWORKS。我没有选择,我的输入是一个格式的字符串。你可以用我描述的算法读取输入字符串。这是我应该自己定义的模板,还是我想在其中存储解析值的模板?
template<typename T>
void getInput(const std::string query, T& entry) {
std::string input;
std::cout << query << std::endl;
getline(std::cin, input);
std::stringstream buffer{input};
buffer >> entry;
}
template<typename T>
void getInput2(std::string query, T& entry) {
bool validInput = false;
while (validInput == false)
{
validInput = true;
std::cout << query << std::endl;
std::cin >> entry;
if (std::cin.fail()) {
validInput = false;
std::cout << "Unacceptable entry\n" << std::endl;
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}