【问题标题】:How to convert an ASCII character into an int in C如何在 C 中将 ASCII 字符转换为 int
【发布时间】:2011-07-16 09:01:33
【问题描述】:

如何在 C 中将 ASCII 字符转换为 int?

【问题讨论】:

  • C 没有“ascii 字符”数据类型,所以这个问题没有意义。
  • 这是一个模棱两可的话题,意味着 1)'1' 到 1 或 2)'@' 到 64;我正在寻找第一个

标签: c ascii character


【解决方案1】:

怎么样:

int a_as_int = (int)'a';

【讨论】:

【解决方案2】:

你在寻找这个吗:

int c = some_ascii_character;

或者只是转换而不分配:

(int)some_aschii_character;

【讨论】:

    【解决方案3】:

    我同意 Ashot 和 Cwan,但也许您想将 '7' 之类的 ascii 密码转换为 7 之类的 int?

    那我推荐:

    char seven = '7';
    int i = seven - '0'; 
    

    或者,也许你会收到警告,

    int i = (int) (seven - '0'); 
    

    在 cmets 后更正,谢谢。

    【讨论】:

    • C 中没有警告。
    • 如果有警告,您更有可能在第一行得到它,它将较大的类型('7' 是 int)转换为较小的类型(char)。跨度>
    【解决方案4】:

    使用 ASCII to Integer atoi() 函数接受字符串并将其转换为整数:

    #include <stdlib.h>
    
    int num = atoi("23"); // 23
    

    如果字符串包含小数,数字将被截断:

    int num = atoi("23.21"); // 23
    

    【讨论】:

    • "23" 不是 ASCII 字符,所以这与(不清楚的)问题无关。
    【解决方案5】:

    C 中的 char 值可以隐式转换为 int。例如,char c; ... printf("%d", c) 打印 c 的十进制 ASCII 值,int i = c;c 的 ASCII 整数值放入 i。您也可以使用(int)c 显式转换它。如果你的意思是别的,比如如何将 ASCII 数字转换为 int,那就是 c - '0',它隐式地将 c 转换为 int,然后减去 '0' 的 ASCII 值,即 48(在 C , '0' 等字符常量是 int 类型,而不是 char,由于历史原因)。

    【讨论】:

      【解决方案6】:

      你的意思是 ASCII 序数值?尝试像这样进行类型转换:

      int x = 'a';
      

      【讨论】:

      • @Jim Balter 对不起,如果这很明显,但我想知道这是 c++ 而不是 c。是因为术语还是我遗漏了什么?
      • @quasiverse 查看编辑——即单击“43 分钟前”链接。请注意,我的评论是 48 分钟前发布的。请注意这一点——它会咬你一口。
      • 哎呀,我傻了,这是我发帖时看到的时间,但当然不是人们在阅读时会看到的时间。
      【解决方案7】:

      正如其他人告诉您的那样,您可以直接转换它...除非您的意思是“我如何将 ASCII 扩展字符转换为其 UTF-16 或 UTF-32 值”。这是一个完全不同的问题(至少同样好)。如果我没记错的话,如果你只使用“纯”C,那么你可以从这里开始:https://stackoverflow.com/questions/114611/what-is-the-best-unicode-library-for-c/114643#114643

      (对于 ASCII 扩展,我的意思是 ASCII 集的众多“扩展”之一。基本 ASCII 集的 0-127 个字符可以直接转换为 Unicode,而 128-255 则不能。)。例如 ISO_8859-1 http://en.wikipedia.org/wiki/ISO_8859-1 是 7 位 ASCII 集或(非常著名的)代码页 437 和 850 的 8 位扩展。

      【讨论】:

      • 任何 UTF 格式的 ASCII (0-127) 字符与其整数表示相同。
      • @Chris 但至少有 50% 的情况下,当有人谈到 ASCII 时,他的意思是“ASCII 扩展”......但是,是的,将这个注释放在回复中会很有趣。谢谢。
      • ASCII 字符的取值范围是 0 到 127,因此将它们转换为 UTF-16 或 UTF-32 只是一种转换。也许你的意思不同,比如转换各种字节编码,如 UTF-8、ISO 8859-1 等。
      • “ASCII 扩展”是一个糟糕的术语,它没有唯一的参照物,甚至没有接近的;有许多“扩展的”ASCII 编码,或一些具有专有意识的商业供应商所称的“代码页”。
      【解决方案8】:

      使用 C99 标准库是不可能的,除非您手动编写从字符常量到相应 ASCII int 值的映射。

      C 中的字符常量,如 'a',不保证是 ASCII。

      C99 仅对这些常量做出一些保证,例如那个digits be contiguous

      ASCII这个词只出现在C99 N1256 standard draft的脚注中,脚注173)说:

      在使用七位 US ASCII 字符集的实现中,打印字符是那些 其值从 0x20(空格)到 0x7E(波浪号);控制字符是那些 值从 0 (NUL) 到 0x1F (US),字符 0x7F (DEL)。

      暗示ASCII不是唯一的可能性

      【讨论】:

      • 这些都与问题无关(其含义不清楚)。
      • @JimBalter 感谢您的反馈。您能否指出正确的标准报价,即不能保证(int)'a' == 0x61,并解释我的报价所指的是什么?
      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多