Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将单个字符转换为int_C++_Char - Fatal编程技术网

C++ 如何将单个字符转换为int

C++ 如何将单个字符转换为int,c++,char,C++,Char,我有一串数字,例如“123456789”,我需要提取其中的每一个数字,以便在计算中使用它们。我当然可以通过索引访问每个字符,但如何将其转换为int 我已经研究了atoi(),但它使用字符串作为参数。因此,我必须将每个字符转换为字符串,然后对其调用atoi。有更好的方法吗?您可以利用这样一个事实,即数字的字符编码顺序都是从48(对于“0”)到57(对于“9”)。这适用于ASCII、UTF-x和几乎所有其他编码(有关更多信息,请参阅下面的注释) 因此,任何数字的整数值都是数字减去“0”(或48) 是

我有一串数字,例如“123456789”,我需要提取其中的每一个数字,以便在计算中使用它们。我当然可以通过索引访问每个字符,但如何将其转换为int


我已经研究了atoi(),但它使用字符串作为参数。因此,我必须将每个字符转换为字符串,然后对其调用atoi。有更好的方法吗?

您可以利用这样一个事实,即数字的字符编码顺序都是从48(对于“0”)到57(对于“9”)。这适用于ASCII、UTF-x和几乎所有其他编码(有关更多信息,请参阅下面的注释)

因此,任何数字的整数值都是数字减去“0”(或48)

是同义词

char c = '1';
int i = c - 48; // i is now equal to 1, not '1'
然而,我发现第一个
c-'0'
更具可读性。

如果您担心编码,您可以随时使用switch语句

只是要小心那些大数字的格式。在某些系统中,整数的最大大小低至65535(32767有符号)。在其他系统中,您有2147483647(或4294967295未签名)

或者您可以使用“正确”的方法,类似于您最初的atoi方法,但使用std::stringstream代替。这应该与作为输入的字符以及字符串一起使用。(boost::lexical_cast是另一个更方便语法的选项)


(ATOI是一个古老的C函数,通常建议使用更灵活和类型化的C++等价物。可能的是:STR::StrugStof覆盖字符串转换)< /P> < P> >下面的方法有什么问题吗?< / P>

int CharToInt(const char c)
{
    switch (c)
    {
    case '0':
        return 0;
    case '1':
        return 1;
    case '2':
        return 2;
    case '3':
        return 3;
    case '4':
        return 4;
    case '5':
        return 5;
    case '6':
        return 6;
    case '7':
        return 7;
    case '8':
        return 8;
    case '9':
        return 9;
    default:
        return 0;
    }
}
#包括
#包括
使用名称空间std;
void main()
{
char ch;
int x;
cin>>ch;
x=char(ar[1]);

cout提供的答案非常好,只要您只想处理阿拉伯数字,并且在编码中这些数字是连续的,并且与ASCII处于相同的位置

几乎总是这样

如果不是,那么你需要一个合适的库来帮助你

让我们从一开始

  • 首先将字节字符串转换为unicode字符串。(留给读者作为练习)
  • 然后使用查看每个字符
  • 如果我们使用的字符是
    UBool u\u isdigit(UChar32 c)
  • 然后该值是
    int32\u t u\u charDigitValue(UChar32 c)
  • 或者ICU有一些函数可以为您执行此操作-我还没有详细介绍。

    您可以使用atoi()函数
    #define toDigit(c) (c-'0')
    
    #包括
    #包括
    int main(int argc,char*argv[]){
    int-num;
    num=atoi(argv[1]);
    printf(“\n%d”,num);
    }
    
    通过这种方式,您可以轻松地将字符转换为int和int转换为char:

    int charToInt(char c)
    {
       int arr[]={0,1,2,3,4,5,6,7,8,9};
       return arr[c-'0'];
    }
    

    对我来说,以下几点非常有效:

    QChar c = '5';
    int x = c.digitValue();
    // x is now 5
    
    文件:其中说明:

    返回数字的数值,如果字符不正确,则返回-1 一个数字


    一个简单的switch语句如何帮助不同的编码?因为unicode数字正好覆盖10个位置,而ascii数字正好覆盖10个位置。我是否遗漏了什么?您不必担心编码问题。即使数字不是从48到58-这些数字在编码中必须都是相邻的。因此您仍然可以使用subtrac我从任何一个数字中得到了正确的结果,我相信我读到了标准的一个,我的C++是生锈的,我认为有一个更安全的方法,但是没有时间去看。为什么你需要提取每一个,而不是把一系列数字当作一个实际的数字来处理?字符串不是真正的数字,而是个人的数字,确切地说,是一个社会。安全号码。我想运行一个计算验证SSN。是否有任何编码,其中“9”-0’=9?我甚至不确定是否允许这样的编码,每个ISO C++。在编码和数字的顺序,我问这个问题。简短的答案是“任何基于ASCII或EBCDIC的编码,是的”。(这意味着我们将在日常生活和网络中遇到99.9%的编码)有趣的是,C/C++标准似乎只支持数字排序的编码。在任何编码中,它不包含“0”< 1”< 2】< 3”,这将是一个非常非常奇怪的决定。C++标准保证<代码> '0' <代码> >代码> > '9' <代码>发生在正确的顺序上。在字符集中。因此
    c-'0'
    适用于所有系统,而
    c-48
    不适用于EBCDIC。请注意,C11说明:在源和执行基本字符集中,上述十进制数字列表中
    0
    后的每个字符的值都应大于前一个字符的值C++标准将有类似的规则。除了重复的代码来做一些相当琐碎的事情之外,没有任何一个。Binary Worrier的答案是简单得多,只要输入编码是已知的,并且允许这个快捷方式。我的版本也更短,不管编码如何,都会工作,但会慢一点。@ JALF二进制担忧者的回答I保证使用任何C++或POSIX兼容的编码<代码> ATOI 转换一个字符串,而不是像OP WaundEdGod这样的一个字符!它值得。<代码> ARR[X]=x < /代码>对于所有有效值<代码> x /代码>。
    #include <stdlib.h>
    #include <stdio.h>
    int main(int argc, char* argv[]){
        int num ;
        num = atoi(argv[1]);
        printf("\n%d", num);
    }
    
    int charToInt(char c)
    {
       int arr[]={0,1,2,3,4,5,6,7,8,9};
       return arr[c-'0'];
    }
    
    QChar c = '5';
    int x = c.digitValue();
    // x is now 5