如何在C和c++中将字符转换为int ?


当前回答

Char只是一个1字节的整数。char类型没有什么神奇之处!就像你可以将short类型赋值给int类型,或将int类型赋值给long类型一样,你也可以将char类型赋值给int类型。

是的,原始数据类型的名称恰好是“char”,这暗示它应该只包含字符。但实际上,“char”只是一个糟糕的名字选择,会让每个试图学习这门语言的人感到困惑。更好的名称是int8_t,如果您的编译器遵循最新的C标准,则可以使用该名称。

当然,在进行字符串处理时应该使用char类型,因为经典ASCII表的索引适合1个字节。不过,您也可以使用常规int类型进行字符串处理,尽管在现实世界中没有任何实际原因可以解释为什么要这样做。例如,下面的代码将完美地工作:

  int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };
  
  for(i=0; i<6; i++)
  {
    printf("%c", str[i]);
  }

你必须意识到字符和字符串只是数字,就像计算机中的其他东西一样。当您在源代码中写入'a'时,它会被预处理为数字97,这是一个整数常数。

如果你写一个表达式

char ch = '5';
ch = ch - '0';

这实际上等价于

char ch = (int)53;
ch = ch - (int)48;

然后通过C语言的整数提升

ch = (int)ch - (int)48;

然后截断为一个字符以适应结果类型

ch = (char)( (int)ch - (int)48 );

行与行之间有很多微妙的东西,其中char被隐式地当作int。

其他回答

使用static_cast < int >:

int num = static_cast<int>(letter); // if letter='a', num=97

编辑:你可能应该尽量避免使用(int)

Int num = (Int)字母;

为什么使用static_cast<int>(x)而不是(int)x?更多信息。

(这个答案解决了c++方面的问题,但C中也存在符号扩展问题。)

处理所有三种char类型(有符号、无符号和char)比最初看起来更精细。0到SCHAR_MAX(对于8位字符是127)范围内的值很容易:

char c = somevalue;
signed char sc = c;
unsigned char uc = c;
int n = c;

但是,当somevalue超出该范围时,只有通过unsigned char才能在所有三种类型中获得“相同”char值的一致结果:

char c = somevalue;
signed char sc = c;
unsigned char uc = c;
// Might not be true: int(c) == int(sc) and int(c) == int(uc).
int nc = (unsigned char)c;
int nsc = (unsigned char)sc;
int nuc = (unsigned char)uc;
// Always true: nc == nsc and nc == nuc.

这在使用ctype.h中的函数时很重要,例如isupper或toupper,因为符号扩展:

char c = negative_char;  // Assuming CHAR_MIN < 0.
int n = c;
bool b = isupper(n);  // Undefined behavior.

注意到int的转换是隐式的;这有相同的UB:

char c = negative_char;
bool b = isupper(c);

要解决这个问题,使用unsigned char,这很容易通过safe_ctype包装ctype.h函数:

template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }

//...
char c = CHAR_MIN;
bool b = safe_ctype<isupper>(c);  // No UB.

std::string s = "value that may contain negative chars; e.g. user input";
std::transform(s.begin(), s.end(), s.begin(), &safe_ctype<toupper>);
// Must wrap toupper to eliminate UB in this case, you can't cast
// to unsigned char because the function is called inside transform.

这是可行的,因为任何接受三种char类型中的任何一种的函数也可以接受另外两种char类型。它导致两个可以处理任何类型的函数:

int ord(char c) { return (unsigned char)c; }
char chr(int n) {
  assert(0 <= n);  // Or other error-/sanity-checking.
  assert(n <= UCHAR_MAX);
  return (unsigned char)n;
}

// Ord and chr are named to match similar functions in other languages
// and libraries.

Ord (c)总是给你一个非负值-即使传递一个负字符或负符号字符- CHR取Ord产生的任何值并返回完全相同的字符。

在实践中,我可能只使用unsigned char类型而不是使用这些类型,但它们确实简洁地包装了类型转换,提供了一个方便的地方来添加int-to-char类型的错误检查,并且在需要多次使用它们时更简短、更清楚。

嗯,在ASCII码中,数字(数字)从48开始。你所需要做的就是:

int x = (int)character - 48;

或者,因为字符'0'的ASCII码是48,你可以这样写:

int x = character - '0';  // The (int) cast is not necessary.

我建议使用以下函数:

/* chartoint: convert char simbols to unsigned int*/
int chartoint(char s[])
{

    int i, n;
    n = 0;
    for (i = 0; isdigit(s[i]); ++i){
        n = 10 * n + (s[i] - '0');
    }
    return n; 
}

函数的结果可以通过以下方法检查:

printf("char 00: %d \r\n", chartoint("00"));
printf("char 01: %d \r\n", chartoint("01"));
printf("char 255: %d \r\n", chartoint("255"));

Char只是一个1字节的整数。char类型没有什么神奇之处!就像你可以将short类型赋值给int类型,或将int类型赋值给long类型一样,你也可以将char类型赋值给int类型。

是的,原始数据类型的名称恰好是“char”,这暗示它应该只包含字符。但实际上,“char”只是一个糟糕的名字选择,会让每个试图学习这门语言的人感到困惑。更好的名称是int8_t,如果您的编译器遵循最新的C标准,则可以使用该名称。

当然,在进行字符串处理时应该使用char类型,因为经典ASCII表的索引适合1个字节。不过,您也可以使用常规int类型进行字符串处理,尽管在现实世界中没有任何实际原因可以解释为什么要这样做。例如,下面的代码将完美地工作:

  int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };
  
  for(i=0; i<6; i++)
  {
    printf("%c", str[i]);
  }

你必须意识到字符和字符串只是数字,就像计算机中的其他东西一样。当您在源代码中写入'a'时,它会被预处理为数字97,这是一个整数常数。

如果你写一个表达式

char ch = '5';
ch = ch - '0';

这实际上等价于

char ch = (int)53;
ch = ch - (int)48;

然后通过C语言的整数提升

ch = (int)ch - (int)48;

然后截断为一个字符以适应结果类型

ch = (char)( (int)ch - (int)48 );

行与行之间有很多微妙的东西,其中char被隐式地当作int。