检查字符串是否为基数16

时间:2017-12-02 21:38:10

标签: c++ string base

我一直在努力解决这个问题,但我没有得到积极的结果。

所以,我的任务是检查字符串是否是基数为16的数字。

示例:s =“1AB”,它将显示YES 427

这是我的代码。

#include <iostream>
#include <string.h>
using namespace std;
 int power (int a, int b)
 {
     if(b==1) return a; 
     else return a*power(a,b-1);
 }
 void conv(char s[],int &n)
 {
     int S=0,i,p=0;
     for(i=n-1;i>=0;i--)
     {
         if(s[i]>='0' && s[i]<='9')
            S+=(s[i]-48) * power(16,p); //ex:s[i]='1' ==> S+=(49-49)*...
         else S+=(s[i]-55) * power(16,p); //s[i]='A' ==> S+=(65-55) *...
         p++;
     }
 }
int main()
{
 int n,i,k=0;
 char s[255];
 cin.get(s,255);
 cin.get();
 n=strlen(s);
 for(i=0;i<n;i++)
 {
     if(strchr("0123456789ABCDEF",s[i])) k++;
 }
 if(k==0) cout<<"not in base 16";
 else{
    conv(s,n); cout<<s;}
return 0;
}

2 个答案:

答案 0 :(得分:0)

您可以使用std::isxdigit,例如:

#include <cctype>
#include <string>
#include <iostream>

bool IsThisStringAHexNumber(std::string const &str)
{
    for (size_t i = 0, n = str.length(); i < n; ++i)
        if (!std::isxdigit(str[i]))
            return false;

    return true;
}

int main()
{

    std::cout << std::boolalpha << IsThisStringAHexNumber("298722h2jjh") << std::endl;
    std::cout << std::boolalpha << IsThisStringAHexNumber("2abc66f") << std::endl;

    return 0;
}

打印:

false
true

答案 1 :(得分:0)

如果你想要几乎干净的解决方案,你可以查看我的:

#include <iostream>
using namespace std;

bool IsHex(string& in) {
    for (char d : in) {
        if (!isxdigit(d)) return false;
    }
    return true;
}

int Convert(string& in) {
    int val = 0;
    for (char d : in) {
        val = val * 16 + (isdigit(d)? d - '0' : 10 + (isupper(d)? d - 'A' : d - 'a'));
    }
    return val;
}

int main() {
    string in;
    cin >> in;
    if (!IsHex(in)) cout << "Not a correct hex number" << endl;
    else cout << "YES " << Convert(in) << endl;
    return 0;
}

我已经对您的代码进行了一些更改以使其正常工作。您可以轻松找到更改。

#include <iostream>
#include <string.h>
using namespace std;
 int power (int a, int b)
 {
     if (b == 0) return 1;
     if(b==1) return a; 
     else return a*power(a,b-1);
 }
 int conv(char s[],int &n)
 {
     int S=0,i,p=0;
     for(i=n-1;i>=0;i--)
     {
         if(s[i]>='0' && s[i]<='9')
            S+=(s[i]-48) * power(16,p); //ex:s[i]='1' ==> S+=(49-49)*...
         else S+=(s[i]-55) * power(16,p); //s[i]='A' ==> S+=(65-55) *...
         p++;
     }
     return S;
 }
int main()
{
 int n,i,k=0;
 char s[255];
 cin.get(s,255);
 cin.get();
 n=strlen(s);
 for(i=0;i<n;i++)
 {
     if(!strchr("0123456789ABCDEF",s[i])) break;
 }
 if(i < n) cout<<"not in base 16";
 else{
    cout << conv(s,n) << endl;}
return 0;
}