8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何将单个字符转换为 int

jcesarmobile 1月前

101 0

我有一串数字,例如 \'123456789\',我需要提取每个数字以用于计算。我当然可以通过索引访问每个字符,但如何将其转换为 int?我已经

我有一串数字,例如 \'123456789\',我需要提取每个数字以用于计算。我当然可以通过索引访问每个字符,但如何将其转换为 int?

我研究过 atoi(),但它接受一个字符串作为参数。因此我必须将每个字符转换为字符串,然后对其调用 atoi。有没有更好的方法?

帖子版权声明 1、本帖标题:如何将单个字符转换为 int
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由jcesarmobile在本站《for-loop》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 对我来说,以下方法非常有效:

    QChar c = '5';
    int x = c.digitValue();
    // x is now 5
    

    文档: int QChar::digitValue() const 其中说明:

    返回数字的数值,如果字符不是数字,则返回 -1。

  • 对于 x 的所有有效值,arr[x] == x。由于访问越界数组是 UB,因此可以假设对于所有 x,arr[x] == x。

  • 通过这种方式,您可以轻松地将 char 转换为 int,将 int 转换为 char:

    int charToInt(char c)
    {
       int arr[]={0,1,2,3,4,5,6,7,8,9};
       return arr[c-'0'];
    }
    
  • @jalf Binary Worrier 的答案保证适用于任何符合 C++ 或 POSIX 的编码

  • 没有,除了需要大量重复代码才能完成一些相当琐碎的事情。Binary Worrier 的答案要简单得多,只要知道输入编码,并允许这种快捷方式。我的版本也更短,无论编码如何都能工作,但速度会慢一点。

  • 下面的做法有问题吗?

    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;
        }
    }
    
  • 您无需担心编码。即使数字不是从 48 到 58 - 数字在编码中也必须相邻。因此,您仍然可以从任何数字中减去“0”并获得正确的结果。我相信我在标准中读到了这一点

  • 因为 unicode 数字正好覆盖 10 个位置,而 ascii 数字正好覆盖 10 个位置。我遗漏了什么吗?

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

    保存这些大数字时一定要小心格式。在某些系统中,整数的最大大小低至 65,535(32,767 个有符号数)。在其他系统中,整数的最大大小为 2,147,483,647(或 4,294,967,295 个无符号数)

  • 我同意@jalf。使用 sstream 库和 stoi 似乎是推荐的方法:

    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main() {
    
      stringstream st;
      st << 1  << '2';
    
      cout << stoi(st.str()) + 1; 
    
      return 0;
    }
    

    输出

    13
    

    我是 C++ 的一名新生,但也是资深的 LAMP 堆栈开发人员。我希望字符串类有更多功能,可以在字符和字符串之间顺利转换,但我尚未找到原生支持的功能。

  • #include<iostream>
    #include<stdlib>
    using namespace std;
    
    void main()
    {
         char ch;
         int x;
         cin >> ch;
         x = char (ar[1]);
         cout << x;
    }
    
  • 只要您只想处理阿拉伯数字,并且使用这些数字连续的编码,并且与 ASCII 位于同一位置,那么提供的答案就很棒。

    情况几乎总是如此。

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

    让我们从 ICU .

    1. 首先将字节字符串转换为unicode字符串。(留给读者练习)。
    2. 然后使用 uchar.h 查看每个字符。
    3. 如果我们的角色是 UBool u_isdigit (UChar32 c)
    4. 那么值是 int32_t u_charDigitValue ( UChar32 c )

    或者 ICU 也许有一些功能可以为您完成此操作 - 我还没有详细研究过它。

  • 您可以使用 atoi() 函数

    #include <stdlib.h>
    #include <stdio.h>
    int main(int argc, char* argv[]){
        int num ;
        num = atoi(argv[1]);
        printf("\n%d", num);
    }
    
  • 或者您可以使用“正确”方法,类似于您原来的 atoi 方法,但改用 std::stringstream。这应该适用于字符和字符串作为输入。(boost::lexical_cast 是另一个更方便语法的选项)

    (atoi 是一个旧的 C 函数,通常建议尽可能使用更灵活、类型更安全的 C++ 等效函数。std::stringstream 涵盖与字符串的转换)

  • #define toDigit(c) (c-'0')
    
  • 请注意,C11 §5.2.1 字符集 ¶3 规定:在源和执行基本字符集中,上述十进制数字列表中 0 后面的每个字符的值应比前一个字符的值大 1。C++ 标准也会有类似的规则。

  • C++ 标准保证“0”到“9”在字符集中以正确的顺序相邻出现。因此,c -“0”适用于所有系统,而 c - 48 则不适用于 EBCDIC。

  • 是否存在不满足 '0' < '1' < '2' < '3' 的编码?这至少是一个非常非常奇怪的决定

  • 关于编码和数字顺序,我问了这个问题 .com/questions/782373/…。简短的回答是“任何基于 Ascii 或 EBCDIC 的编码,是的”(这意味着我们在日常生活和网络上会遇到的 99.9% 的编码)。同样有趣的是,c/c++ 标准似乎规定它们只支持数字有序的编码。

返回
作者最近主题: