当前位置: 首页 > 知识库问答 >
问题:

递归cin.getline()不想要求输入

贝成业
2023-03-14

以下是代码

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;
}

如果我输入999999999,它会调用自己,但在第四行它不会再要求输入。调试器不能给出更多的信息,因为这是一个更具体的语言问题。提前感谢。祝您愉快!是的,目标是将输入解析为短输入。我知道从最小负值中丢失1,wip:)

==编辑===

我试过goto...不,是一样的。所以我想这与可见变量或地址无关。

==编辑===

我不能用操作员

共有1个答案

鲁炳
2023-03-14

999999999将导致溢出,因此为cin设置了failbit。然后程序到达read(in),然后是cin.getline()。在这里,由于failbit,cin将不再要求任何输入。

如果你想知道为什么在我的代码中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;
}

正如我们已经讨论过的,你不需要新的。

在解析之前检查字符串读取是否干净。如果您混合检查和解析,事情将变得复杂。

你不需要递归。

通过 istream::getline 从 stream 中读取字符似乎是我们在这里唯一的选择。而当发生错误时,这个函数真的并不能告诉我们太多,我们必须分别处理溢出和其他问题。

 类似资料:
  • 对于,我被赋予和。 现在给定N、A、B、C和X,如何有效地找到所有N个元素? 我需要把这N个元素分成2组,其中最大的元素在第一组,第二大的元素在第二组,第三大的元素在第一组,以此类推。。。最后需要找到两个集合元素之和的绝对差。 我可以在不计算所有元素的情况下找到这个差异吗?因为N可以大到最大值为100。

  • 嗨,我在理解为什么我的递归逻辑返回第一个输入时有一些问题,尽管它似乎没有通过验证检查。Java中的一个简单例子: 我的理解是,函数要调用自己,直到满足条件,返回一个0到9之间的数。条件检查似乎是可行的,但是无论第一个数字是什么,总是被返回。一个执行示例产生:

  • 使用以下代码: 为什么这个输出: 而不是我所期望的,那就是: 我讨厌递归。我讨厌递归。我讨厌递归。谢谢

  • 为什么我在输出中得到一个额外的1*1,这有点倒退?有点像递归初学者,希望得到详细的答案。 输出

  • 我有点困惑,如果我分配总计=0,那么每次递归方法运行时,它都会重置为零,我试图求和所有的奇数,它在思想java书中,公共和私有变量还没有被引入。

  • 我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?