C++ 如何将单个字符转换为int
我有一串数字,例如“123456789”,我需要提取其中的每一个数字,以便在计算中使用它们。我当然可以通过索引访问每个字符,但如何将其转换为intC++ 如何将单个字符转换为int,c++,char,C++,Char,我有一串数字,例如“123456789”,我需要提取其中的每一个数字,以便在计算中使用它们。我当然可以通过索引访问每个字符,但如何将其转换为int 我已经研究了atoi(),但它使用字符串作为参数。因此,我必须将每个字符转换为字符串,然后对其调用atoi。有更好的方法吗?您可以利用这样一个事实,即数字的字符编码顺序都是从48(对于“0”)到57(对于“9”)。这适用于ASCII、UTF-x和几乎所有其他编码(有关更多信息,请参阅下面的注释) 因此,任何数字的整数值都是数字减去“0”(或48) 是
我已经研究了atoi(),但它使用字符串作为参数。因此,我必须将每个字符转换为字符串,然后对其调用atoi。有更好的方法吗?您可以利用这样一个事实,即数字的字符编码顺序都是从48(对于“0”)到57(对于“9”)。这适用于ASCII、UTF-x和几乎所有其他编码(有关更多信息,请参阅下面的注释) 因此,任何数字的整数值都是数字减去“0”(或48) 是同义词
char c = '1';
int i = c - 48; // i is now equal to 1, not '1'
然而,我发现第一个c-'0'
更具可读性。如果您担心编码,您可以随时使用switch语句
只是要小心那些大数字的格式。在某些系统中,整数的最大大小低至65535(32767有符号)。在其他系统中,您有2147483647(或4294967295未签名)或者您可以使用“正确”的方法,类似于您最初的atoi方法,但使用std::stringstream代替。这应该与作为输入的字符以及字符串一起使用。(boost::lexical_cast是另一个更方便语法的选项)
(ATOI是一个古老的C函数,通常建议使用更灵活和类型化的C++等价物。可能的是:STR::StrugStof覆盖字符串转换)< /P> < P> >下面的方法有什么问题吗?< / P>
int CharToInt(const char c)
{
switch (c)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
return 0;
}
}
#包括
#包括
使用名称空间std;
void main()
{
char ch;
int x;
cin>>ch;
x=char(ar[1]);
cout提供的答案非常好,只要您只想处理阿拉伯数字,并且在编码中这些数字是连续的,并且与ASCII处于相同的位置
几乎总是这样
如果不是,那么你需要一个合适的库来帮助你
让我们从一开始
首先将字节字符串转换为unicode字符串。(留给读者作为练习)
然后使用查看每个字符
如果我们使用的字符是UBool u\u isdigit(UChar32 c)
然后该值是int32\u t u\u charDigitValue(UChar32 c)
或者ICU有一些函数可以为您执行此操作-我还没有详细介绍。您可以使用atoi()函数
#define toDigit(c) (c-'0')
#包括
#包括
int main(int argc,char*argv[]){
int-num;
num=atoi(argv[1]);
printf(“\n%d”,num);
}
通过这种方式,您可以轻松地将字符转换为int和int转换为char:
int charToInt(char c)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
return arr[c-'0'];
}
对我来说,以下几点非常有效:
QChar c = '5';
int x = c.digitValue();
// x is now 5
文件:其中说明:
返回数字的数值,如果字符不正确,则返回-1
一个数字
一个简单的switch语句如何帮助不同的编码?因为unicode数字正好覆盖10个位置,而ascii数字正好覆盖10个位置。我是否遗漏了什么?您不必担心编码问题。即使数字不是从48到58-这些数字在编码中必须都是相邻的。因此您仍然可以使用subtrac我从任何一个数字中得到了正确的结果,我相信我读到了标准的一个,我的C++是生锈的,我认为有一个更安全的方法,但是没有时间去看。为什么你需要提取每一个,而不是把一系列数字当作一个实际的数字来处理?字符串不是真正的数字,而是个人的数字,确切地说,是一个社会。安全号码。我想运行一个计算验证SSN。是否有任何编码,其中“9”-0’=9?我甚至不确定是否允许这样的编码,每个ISO C++。在编码和数字的顺序,我问这个问题。简短的答案是“任何基于ASCII或EBCDIC的编码,是的”。(这意味着我们将在日常生活和网络中遇到99.9%的编码)有趣的是,C/C++标准似乎只支持数字排序的编码。在任何编码中,它不包含“0”< 1”< 2】< 3”,这将是一个非常非常奇怪的决定。C++标准保证<代码> '0' <代码> >代码> > '9' <代码>发生在正确的顺序上。在字符集中。因此c-'0'
适用于所有系统,而c-48
不适用于EBCDIC。请注意,C11说明:在源和执行基本字符集中,上述十进制数字列表中0
后的每个字符的值都应大于前一个字符的值C++标准将有类似的规则。除了重复的代码来做一些相当琐碎的事情之外,没有任何一个。Binary Worrier的答案是简单得多,只要输入编码是已知的,并且允许这个快捷方式。我的版本也更短,不管编码如何,都会工作,但会慢一点。@ JALF二进制担忧者的回答I保证使用任何C++或POSIX兼容的编码<代码> ATOI 转换一个字符串,而不是像OP WaundEdGod这样的一个字符!它值得。<代码> ARR[X]=x < /代码>对于所有有效值<代码> x /代码>。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int num ;
num = atoi(argv[1]);
printf("\n%d", num);
}
int charToInt(char c)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
return arr[c-'0'];
}
QChar c = '5';
int x = c.digitValue();
// x is now 5