如何在C中将ASCII字符转换为整数

30

如何在C语言中将ASCII字符转换为整数?


C语言没有“ASCII字符”数据类型,因此这个问题是没有意义的。 - Jim Balter
这是一个非常模糊的话题,意思是1)从1到1或2)从@到64;我正在寻找第一个。 - vincent thorpe
8个回答

27

怎么样:

int a_as_int = (int)'a';

2
我会在参数中添加必要的引用:https://dev59.com/i3RC5IYBdhLWcg3wCMc6 - xanatos

19

我同意Ashot和Cwan的观点,但也许你想将类似于“7”的ASCII密码转换为数字“7”?

那么我建议使用:

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

或者,你可能会收到警告。

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

在评论后进行了更正,感谢提供意见。


在C语言中没有这方面的警告。 - Chris Lutz
如果有警告,你更可能在第一行收到它,因为它将一个较大的类型('7'是int)转换为较小的类型(char)。 - Jim Balter

16

你是在寻找这个吗:

int c = some_ascii_character;

或者只是进行转换而不赋值:

(int)some_ascii_character;

12

使用将字符串转换为整数的ASCII to Integer atoi()函数:

#include <stdlib.h>

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

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

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

3
“23”不是ASCII字符,因此这与(不清楚的)问题无关。 - Jim Balter

6
在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类型)。

2
你是指ASCII序号值吗?尝试像这样进行类型转换:
int x = 'a';

@Jim Balter 对不起,如果这很明显,但我想知道这是C++而不是C。这是因为术语还是我漏掉了什么? - flight
@quasiverse 看看编辑记录--也就是点击“43分钟前”链接。注意,我的评论是在48分钟前发布的。总的来说要小心这个问题--它会在SO上给你带来麻烦。 - Jim Balter
啊,我太傻了。当我发布那篇文章时,看到的是那些时间,但那并不是读者阅读时会看到的时间。 - Jim Balter

0

就像其他人告诉你的那样,你可以直接转换它...除非你的意思是“如何将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集的8位扩展,或者是(相当著名的)代码页437和850。


2
ASCII(0-127)字符在任何UTF格式中都与它们的整数表示相同。 - Chris Lutz
@Chris 但至少有50%的时候,当有人谈论ASCII时,他们指的是“ASCII扩展”...但是,把这个注释放在回复中会很有趣。谢谢。 - xanatos
ASCII字符的值范围从0到127,因此将它们转换为UTF-16或UTF-32只是一种类型转换。也许你指的是不同的字节编码转换,比如UTF-8、ISO 8859-1等。 - Jim Balter
“ASCII扩展”是一个不太准确的术语,没有独特的指称,甚至可以说根本不存在;有许多“扩展”的ASCII编码,或者像一些专有商业供应商所称的“代码页”。 - Jim Balter

0

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

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

C99仅对这些常量做出了一些保证,例如数字连续

单词ASCII仅在C99 N1256标准草案的页脚注释中出现,页脚注释173)说:

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

这意味着ASCII并不是唯一的可能性。


这些都与问题无关(其含义不明确)。 - Jim Balter
1
@JimBalter 感谢您的反馈。您能指出哪个标准引用表明 (int)'a' == 0x61 不是保证的,并解释一下我的引用是指什么吗? - Ciro Santilli OurBigBook.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接