如何在C和c++中将字符转换为int ?
当前回答
我建议使用以下函数:
/* 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"));
其他回答
嗯,在ASCII码中,数字(数字)从48开始。你所需要做的就是:
int x = (int)character - 48;
或者,因为字符'0'的ASCII码是48,你可以这样写:
int x = character - '0'; // The (int) cast is not necessary.
C和c++总是将类型提升到至少int。此外,字符字面量在C中是int类型,在c++中是char类型。
可以通过赋值给int类型来转换char类型。
char c = 'a'; // narrowing on C
int a = c;
对于char或short to int,只需要赋值。
char ch = 16;
int in = ch;
与int64相同。
long long lo = ch;
所有值都是16。
我建议使用以下函数:
/* 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"));
(这个答案解决了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类型的错误检查,并且在需要多次使用它们时更简短、更清楚。
推荐文章
- 如何构建和使用谷歌TensorFlow c++ api
- C“int”的大小是2字节还是4字节?
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 有效,但毫无价值的语法在开关情况下?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- 有一个好的Valgrind Windows的替代品吗?
- gcc在哪里查找C和c++头文件?
- 为什么我们需要require require ?