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顺便说一句,我并没有说我能写出更好的代码,也没有暗示这一点。我只是举了一个有效的例子,没有参与竞争。我确实说过你的代码确实有很多问题,如果你觉得被冒犯了,我向你道歉。谢谢你的帮助!很抱歉误解。