[英]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.