Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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语言中字符到整数的转换_C_Char - Fatal编程技术网

C语言中字符到整数的转换

C语言中字符到整数的转换,c,char,C,Char,如果要将单个数值char转换为其数值,例如: char c = '5'; 我想让c保持5而不是'5',这样做是100%便携的吗 c = c - '0'; 我听说所有字符集都是按连续顺序存储数字的,所以我假设是这样,但我想知道是否有一个有组织的库函数来进行这种转换,以及按照惯例是如何进行的。我是一个真正的初学者:)是的。只要您使用标准ascii字符(如本例中所示),这是安全的。您可以使用,这是标准库的一部分。试试这个: char c = '5' - '0'; 是的,这是一个安全的转换。C要求

如果要将单个数值
char
转换为其数值,例如:

char c = '5';
我想让
c
保持
5
而不是
'5'
,这样做是100%便携的吗

c = c - '0';

我听说所有字符集都是按连续顺序存储数字的,所以我假设是这样,但我想知道是否有一个有组织的库函数来进行这种转换,以及按照惯例是如何进行的。我是一个真正的初学者:)

是的。只要您使用标准ascii字符(如本例中所示),这是安全的。

您可以使用,这是标准库的一部分。

试试这个:

char c = '5' - '0';

是的,这是一个安全的转换。C要求它工作。本保函见最新ISO C标准第5.2.1节第2段,其最新草案为:

基本源字符集和基本执行字符集应具有以下特性 成员:
[…]
10位十进制数字
0123456789

[…]
在源和执行基本字符集中 上述十进制数字列表中0后的每个字符的值应大于1 上一个参数的值

ASCII和EBCDIC以及由此派生的字符集都满足这一要求,这就是为什么C标准能够实施这一要求。注意,字母在EBCDIC中不是连续的,C不要求它们是连续的

没有库函数可以为单个
char
执行此操作,您需要首先构建一个字符串:

int digit_to_int(char d)
{
 char str[2];

 str[0] = d;
 str[1] = '\0';
 return (int) strtol(str, NULL, 10);
}
您还可以使用
函数进行转换,只要您有一个字符串,但是
更好、更安全


不过,正如评论者所指出的那样,调用一个函数来进行这种转换是极其过分的;您最初减去“0”的方法是正确的方法。我只是想在这里展示如何使用推荐的标准方法,将一个数字作为字符串转换为一个“真”数字。

因为您只转换一个字符,所以函数atoi()太过复杂了。如果要转换数字的字符串表示形式,则atoi()非常有用。其他职位都给出了这方面的例子。如果我读对了你的文章,你只转换了一个数字字符。因此,您只需要转换范围为0到9的字符。在仅转换一个数字字符的情况下,建议减去“0”将得到所需的结果。这之所以有效,是因为ASCII值是连续的(如您所说)。因此,从数字字符中减去ASCII值0(ASCII值48-有关值,请参阅)将得到数字的值。因此,您的示例c=c-'0',其中c=5',实际发生的是53(ASCII值5)-48(ASCII值0)=5

当我第一次发布这个答案时,我没有考虑你关于在不同字符集之间100%可移植的评论。我进一步环顾了一下四周,似乎你的答案仍然基本正确。问题是您使用的是一种8位数据类型的字符。这不适用于所有角色类型。有关Unicode的更多信息,请阅读本文。在这篇文章中,他说他使用wchar_t来表示角色。这对他来说很有效,他用29种语言发布了自己的网站。因此,您需要将您的字符更改为wchar\t。除此之外,他说127和127以下的字符基本相同。这将包括表示数字的字符。这意味着你提出的基本数学应该适用于你试图实现的目标

int i = c - '0';
您应该知道,这不会对字符执行任何验证-例如,如果字符是“a”,那么您将得到91-48=49。特别是当您处理用户或网络输入时,您可能应该执行验证以避免程序中的不良行为。只需检查范围:

if ('0' <= c &&  c <= '9') {
    i = c - '0';
} else {
    /* handle error */
}

如果('0'正常情况下,如果不能保证您的输入在'0'..'9'范围内,您必须执行如下检查:

if (c >= '0' && c <= '9') {
    int v = c - '0';
    // safely use v
}

另一方面,我知道这是一种过分的做法。我只是想将其作为一种可能不会立即显现出来的替代解决方案来介绍。

正如其他人所建议的,但包含在一个函数中:

int char_to_digit(char c) {
    return c - '0';
}
现在只需使用函数,如果最终决定使用不同的方法,只需更改实现(性能、字符集差异等),就不需要更改调用方


此版本假定c包含一个表示数字的字符。在调用函数之前,您可以使用ctype.h的isdigit函数进行检查。

由于“0”、“1”、“2”的ASCII码从48到57排列,它们基本上是连续的。现在算术运算需要将字符数据类型转换为int数据类型。因此你基本上在做的是:
53-48,因此它存储值5,您可以使用该值执行任何整数运算。请注意,当从int转换回char时,编译器不会出错,只会执行一个模256运算,将值置于可接受的范围内

您只需使用
atol()
函数:

int char_to_digit(char c) {
    return c - '0';
}
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    const char *c = "5";
    int d = atol(c);
    printf("%d\n", d);

}
#包括
#包括
int main()
{
常量字符*c=“5”;
int d=原子(c);
printf(“%d\n”,d);
}

这是一种非常简单的操作,复杂且昂贵的方法,也就是int i=d-“0”。这是对您的问题的回答,但不是最佳答案。这是一种过激行为。您用c=c-“0”回答了您自己的问题;这是最佳答案。是的,当然使用函数是过激行为。也许我应该是c这一部分的学习者。过度使用不仅仅是函数方面。使用strtol也是过度使用。这个答案没有解决这个问题的可移植性方面。这个函数不可移植。它在多字节字符集上不起作用
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    const char *c = "5";
    int d = atol(c);
    printf("%d\n", d);

}