【问题标题】:Read in Numbers but Stop at Negative C++读入数字,但停在负 C++
【发布时间】:2016-09-26 05:25:32
【问题描述】:

我要做的是从文本文件(当前称为“输入”)中读取数字。我正在创建两个数组,一个用于整数,一个用于浮点数。数组中的最大项数设置为 50,但最小值为 1。程序停止读取数字的标识符是 int 值中的任何负数。

我不知道为什么,但是当我读回我的数组时会打印出数字,跳过最后的负数,然后打印出剩余插槽(最多 50 个)的乱码。

任何建议将不胜感激。

void Read(ifstream &input, int studentID[], float score[])
{
    int curID;
    float curScore;
    for (int i = 0; i < 50; i++)
    {
        input >> curID >> curScore;
        if (curID < 0)
        {
            return;
        }
        else
        {
            studentID[i] = curID;
            score[i] = curScore;
        }
    }
}

【问题讨论】:

  • 我假设您尝试从 1 到 50 打印数组而不检查读取元素的最大索引的限制。因此,您必须根据该总数保持读取和打印的元素总数。
  • 你是对的。我自己才意识到这一点。我在没有检查数组长度的情况下打印出 50 个值。您能否将您的回复作为答案发布,以便我给予您信任?

标签: c++ arrays input ifstream


【解决方案1】:
if (curID < 0)
{
    return;
}

这是因为如果您遇到负数,您的算法不会将该负数存储在 studentID[i] 中。

因此,studentID 从第一个无效位置开始仍然包含未初始化的值。由于没有魔法标记,也没有计数器传回,您无法重建输入的结尾。

【讨论】:

    【解决方案2】:

    更正您的代码

    int Read(ifstream & input, int studentID[], float score[])
    {
        int curID, i = 0;
        float curScore;
        while (i < 50) {
            input >> curID >> curScore;
            if (curID < 0)
                break;
            else {
                studentID[i] = curID;
                score[i++] = curScore;
            }
        }
        return i;    // This value will be useful while printing the contents
    }
    

    为了避免乱码输出,只迭代直到你读取成功,即Read(...)方法的返回。

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2019-12-13
      • 2014-10-22
      相关资源
      最近更新 更多