C++ 递归cin.getline()不';我不想征求意见
代码如下:C++ 递归cin.getline()不';我不想征求意见,c++,parsing,recursion,C++,Parsing,Recursion,代码如下: void Reader::read(short& in) { char* str = new char[6]; char* strbeg = str; cin.getline(str, 6); in = 0; int value = 0; short sign = 1; if (*str == '+' || *str == '-') { if (*str == '-' ) sign = -1;
void Reader::read(short& in) {
char* str = new char[6];
char* strbeg = str;
cin.getline(str, 6);
in = 0;
int value = 0;
short sign = 1;
if (*str == '+' || *str == '-') {
if (*str == '-' ) sign = -1;
str++;
}
while (isdigit(*str)) {
value *= 10;
value += (int) (*str - '0');
str++;
if (value > 32767) {
cout.write("Error, value can't fit short. Try again.\n", 41);
delete[] strbeg;
read(in);
return;
}
}
if (sign == -1) { value *= -1; }
in = (short) value;
delete[] strbeg;
return;
}
如果我输入99999999,它会自动调用,但在第四行它不会再要求输入。调试器无法提供太多信息,因为这是一个更特定于语言的问题。先谢谢你。祝您有个美好的一天!
是的,目标是将输入解析为简短的。我知道从最小负损失1,在制品:)
==编辑===
我试着去。。。不,是一样的。所以我想这不是关于可见的变量或地址
==编辑===
我不能使用运算符>>,因为任务禁止它。99999999将导致溢出,因此为cin设置了failbit。然后程序到达read(in),然后是
cin.getline()
。这里,由于failbit的原因,cin不会再次请求任何输入
如果你试图找出为什么在我的代码中你会要求更多的输入,你可能会自己发现这一切
我给你举个例子
#include <iostream>
#include <climits>
using namespace std;
int main() {
char str[6];
short x = 0;
bool flag = false;
while (flag == false) {
cin.getline(str, 6);
flag = cin.good();
if (flag) { // if read successfully
char *p = str;
if (*p=='-') // special case for the first character
++p;
while (*p && *p>='0' && *p<='9')
++p;
if (*p) // there is a non digit non '\0' character
flag = false;
}
if (flag == false) {
cout << "An error occurred, try try again." << endl;
if (!cin.eof()) {
cin.unget(); // put back the possibly read '\n'
cin.ignore(INT_MAX, '\n');
}
cin.clear();
} else {
// str is now ready for parsing
// TODO: do your parsing work here
// for exemple x = atoi(str);
}
}
std::cout << x << std::endl;
return 0;
}
#包括
#包括
使用名称空间std;
int main(){
char-str[6];
短x=0;
布尔标志=假;
while(flag==false){
cin.getline(str,6);
flag=cin.good();
if(flag){//if读取成功
char*p=str;
if(*p=='-')//第一个字符的特殊情况
++p;
虽然(*p&&*p>='0'&&*p不是问题,但是在这里进行动态分配没有意义。@molbdnilo getline需要指针。整个任务是避免使用重载(cin>>a)。请尝试char str[6]
@1)2)如果你看了std::basic_istream::getline
(链接在上面)的文档,你会发现failbit
是在提取count-1
字符时设置的。@AlgirdasPreidžius没有恶意的真正意义。还有类似“去读文档”或“去谷歌搜索”的答案据我所知,不受欢迎。发疯并不是常见的问题。再次感谢你的回复。我没有要求你重写我的代码。我要求你告诉我为什么它的行为如此。我可以重写它以使其正常工作,而无需再问。你的代码也没有更好,至少它的行为不像atoi()我将如何用您的atoi()解析double类型最后呢?我的意思是我可以用atoi解析浮点的整数部分,但可能不能解析浮点部分。double没有。我没有重写你的代码。我试图给出一个如何读取输入的示例,仅此而已。如果我没能帮到你,我很抱歉。解析不是这里的主题,如果你在解析方面有问题,你可以发布另一个question.@NapoleonTheCake顺便说一句,我并没有说我能写出更好的代码,也没有暗示这一点。我只是举了一个有效的例子,没有参与竞争。我确实说过你的代码确实有很多问题,如果你觉得被冒犯了,我向你道歉。谢谢你的帮助!很抱歉误解。