检查十六进制前缀后,将字符串转换为int的更简洁方法?

时间:2013-12-17 16:31:40

标签: c++ iostream base

这个小练习是为了从用户那里得到一个可能是十进制,十六进制或八进制的字符串。第一,我需要确定字符串是哪种数字。第二,我需要将该数字转换为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

4 个答案:

答案 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会期望任何基数中的整数。