繁体   English   中英

C++ while 循环未从我的文件中读取 -1

[英]C++ while loop is not reading -1 from my file

我正在编写一个程序,它从 a.txt 文件中读取数字并输出相应数量的星号(对于偶数整数)和美元符号(对于奇数整数)。 例如,3 将 output $$$ 和 2 将 output **。 该程序工作正常,除了它读取数字 -1 时。 其他负数工作得很好,除了-1出于某种原因..

这是我的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <Windows.h>

using namespace std;

int main()
{
int value, even, odd;
ifstream infile;
infile.open("lab6_input.txt");

while (infile >> value)
{
    if (value % 2 == 0)
        cout << string(abs(value), "*$"[value % 2]) << endl;
    else
        cout << string(abs(value), "*$"[value % 2]) << endl;
    value++;
}
infile.close();

system("pause");
return 0;
}

这是我的 output: https://imgur.com/a/favqrLv

output 中的最后一个数字是-1,但它只显示一个空格。

您的代码似乎有点奇怪。 你的变量没有初始化,偶数和奇数都没有使用。 您的 if 语句是不必要的,因为您在两种情况下都有相同的代码。

对于您的问题:您应该使用abs(value)两次。 尝试

while(infile >> value){
cout << string(abs(value), "*$"[abs(value) % 2]) << endl;
value++;
}

活生生的例子

问题出在这里

"*$"[value % 2]

在 C++ 中,对负数应用模运算符的结果是负数(嗯,技术上比这复杂一点)。 因此,当value为负时,该指令会导致未定义的行为,访问数组(字符串文字)越界(索引-1处的那个)。

您可以解决value或结果的绝对值的问题,但请考虑编写一个免费的 function,如下所示。

constexpr bool is_odd(int x)
{
    return x % 2;
}

它将更好地表达意图并帮助编译器优化您的代码(参见例如此处),因为这就像您在问

告诉我value是否可以被 2 整除(除以 2 的余数为零)。

有什么不同

给我value除以 2 的余数


您可能已经注意到,在链接的 Compiler Explorer 页面中,编译器最终使用了一个简单的

and     edi, 1

而不是执行实际的模运算。 这是因为您真正需要的是不太重要的位,您可以直接在代码中使用

value & 1

但请注意,标准(C++17,我在写)并没有强制要求(然而,C++20 将需要二进制补码)类型int的特定二进制表示,因此前一个将是实现定义的(并且错误,如果您碰巧找到一个仍在使用int实现的补码)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM