这个小练习是为了从用户那里得到一个可能是十进制,十六进制或八进制的字符串。第一,我需要确定字符串是哪种数字。第二,我需要将该数字转换为int并以正确的格式显示数字,例如:
cout <<(dec,hex,oct, etc)<< number;
这就是我想出的。我想要一种更简单,更清晰的方式来写这篇文章。
string number = "";
cin >> number;
string prefix = "dec";
char zero = '0';
char hex_prefix = 'x';
string temp = "";
int value = 0;
for(int i =0; i<number.size();++i)
{
if(number[0] == zero)//must be octal or hex
{
if (number[0] == zero && number[1] == hex_prefix ) //is hex
{
prefix = "hex";
for(int i = 0; i < (number.size() - 2); ++i)
{
temp[i] = number[i+2];
}
value = atoi(temp.c_str());
}
//... code continues to deal with octal and decimal
答案 0 :(得分:2)
您正在检查number[0]
两次,这是第一个最明显的问题。
内部if
已经同时检查了number[0]
和number[1]
,我没有看到外部的一点。
最外层的循环也很难理解,你期望在数字之前的非十六进制数据,还是什么?您的问题可以更清楚地说明预期的输入字符串的外观。
我认为最干净的是忽略它,并将其推送到可以解析任何基础中的整数的现有(库)代码中。在C中我会推荐strtoul()
,你当然可以在C ++中使用它。
答案 1 :(得分:0)
你有两个内部循环具有相同的值整数,这可能是代码中的冲突问题。我建议您查看c ++库中的 isdigit 和 islower 方法,并利用这些方法完成您的任务。 isdigit&amp; islower
祝你好运
答案 2 :(得分:0)
这是删除十六进制前缀后打印的数字,否则返回0:
#include<iostream>
#include<cmath>
#include<stdlib.h>
using namespace std;
int main(){
string number = "";
cin >> number;
string prefix = "dec";
char zero = '0';
char hex_prefix = 'x';
string temp = "";
int value = 0;
if (number.size()>=2 && number[0] == zero && number[1] == hex_prefix ) //is hex
{
prefix = "hex";
for(int i = 0; i < (number.size() - 2); ++i)
{
temp[i] = number[i+2];
}
value = atoi(temp.c_str());
}
cout<<value;
return 0;
}
答案 3 :(得分:0)
我发现这个部分解决方案尽可能干净,但它没有报告整数的格式:
int string_to_int(std::string str)
{
std::istringstream stream;
stream.unsetf(std::ios_base::dec);
int result;
if (stream >> result)
return result;
else
throw std::runtime_error("blah");
}
...
cout << string_to_int("55") << '\n'; // prints 55
cout << string_to_int("0x37") << '\n'; // prints 55
这里的要点是stream.unsetf(std::ios_base::dec)
- 它取消了&#34;十进制&#34;默认设置的标志。此格式标志告诉iostreams期望十进制整数。如果没有设置,iostream会期望任何基数中的整数。