C++ 将整数字符串转换为int的最简单方法

C++ 将整数字符串转换为int的最简单方法,c++,C++,我有一个很长的数字,有几百个数字,我把它存储在一个字符串中。 现在,我想把它一位数一位数地读入整数/长位数 long int strol(const char*str,char**endptr,int base) 接受一个结束指针,但我似乎无法将其设置正确,因为它尝试读取所有数字,因此返回LONG\u MAX char str[]= "70172427121883998797908792274921901699720888093776\ 65727333001053367881220235421

我有一个很长的数字,有几百个数字,我把它存储在一个字符串中。 现在,我想把它一位数一位数地读入整数/长位数

long int strol(const char*str,char**endptr,int base)
接受一个结束指针,但我似乎无法将其设置正确,因为它尝试读取所有数字,因此返回
LONG\u MAX

char str[]=
"70172427121883998797908792274921901699720888093776\
65727333001053367881220235421809751254540594752243\
52584907711670556013604839586446706324415722155397\
53697817977846174064955149290862569321978468622482\
83972241375657056057490261407972968652414535100474\
82166370484403199890008895243450658541227588666881\
16427171479924442928230863465674813919123162824586";

char *pEnd; //set pEnd to str[1]'s address how???
long num = strtol(str, &pEnd,  10);
cout << num << endl; //LONG_MAX
charstr[]=
"70172427121883998797908792274921901699720888093776\
65727333001053367881220235421809751254540594752243\
52584907711670556013604839586446706324415722155397\
53697817977846174064955149290862569321978468622482\
83972241375657056057490261407972968652414535100474\
82166370484403199890008895243450658541227588666881\
16427171479924442928230863465674813919123162824586";
char*pEnd//如何将pEnd设置为str[1]的地址???
long num=strtol(str和pEnd,10);

cout如果您想读取单个数字,您可以简单地使用:

int digit = str[digitIndex] - '0';
无论实现所使用的字符集是什么,这都是有效的,因为标准保证数字“0”-“9”将由连续值表示

strtol
endptr
参数不符合您的想法:它用于返回转换停止的位置,而不是告诉函数停止的位置

如果要转换
str
的多位数子字符串,可以仅将所需数字复制到新字符串,如下所示:

std::string partialStr(str+startIndex, numDigits);

然后使用将其转换为整数。

将单个数字转换为整数表示形式很容易,例如

int i = str[0] - '0'; 

第一个数字。因此,您只需创建一个整数数组,迭代字符串并转换每个数字,将结果存储在整数数组中。

结束指针是该strtol的输出。它告诉你它在哪里停止阅读,而不是相反

如果要读取单个数字,请执行以下操作:

digit = str[0] - '0';

如果基数是10,并且
长度
是字符串长度,请执行以下操作:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/*Prototype*/
long int intpow( int base, int exp);

int main(void)
{
    long int result = 0;
    int i, j = 0;
    char str[] = /* blah blah*/

    for( i = LENGHT - 1; i >= 0; i--){
        /* -48 because ASCII code. */
        result +=  ( str[ i ] - 48 ) * intpow( 10, j );
        j++;
    }
}

/* Recursive integer power function*/
long int intpow( int base, int exp)
{
    if( exp == 0)
      return 1;

    else
      return base * intpow( base, exp - 1);
}
#包括
#包括
#包括
/*原型*/
长int intpow(int base,int exp);
内部主(空)
{
长整数结果=0;
int i,j=0;
char str[]=/*诸如此类*/
对于(i=长度-1;i>=0;i--){
/*-48,因为ASCII码*/
结果+=(str[i]-48)*intpow(10,j);
j++;
}
}
/*递归整数幂函数*/
长整数intpow(整数基,整数扩展)
{
如果(exp==0)
返回1;
其他的
返回基*intpow(基,exp-1);
}

如果不仅要转换其中一个数字,还要转换所有数字,请使用std::transform:

size_t N = sizeof(str) -1 ; //or strlen(str) if str is a pointer, not an array
std::vector<int> theInts(N); 
std::transform(str, str+N, begin(theInts), [](char* pc){ return *pc -'0'; });
size\u t N=sizeof(str)-1//或者strlen(str),如果str是指针,而不是数组
std::向量元素(N);
std::transform(str,str+N,begin(theInts),[](char*pc){return*pc-'0';});

不要以这种方式使用
endptr
——它仅用于输出。如果你真的想提取单个数字,我建议你使用一些不是strtol的东西。比如,嗯,将字符转换成字符,然后减去
'0'
!strtol中的endptr参数不是这样做的。再次阅读手册页。@LightnessRacesinOrbit我认为解决方案应该不会不同。@Cthulhu:让回答者决定吧!这是两种不同的语言,通常有非常不同的解决方案。最好询问一个关于其中一个的问题,根据您实际使用的是哪一个。@LightnessRacesinOrbit编辑的标记。C++:但是对于字符数组,我仍然认为它应该与这两者都相关。哦,该死。忘记了所有的ASCII值!谢谢有没有使用strtol的方法?如果我想一次读取多个数字,有没有更好的方法?为什么不使用
cmath
pow函数?还有,你没有错过字符到整数的转换吗?我知道我正在编辑,pow函数使用双参数,他不需要。我将使用类似的东西+1.但尚未测试上述内容;)代码不正确。1.它应该是
str.size()
,而不是
sizeof(str)
,2。那个
函数看上去不对劲。但是
std::transform
确实有可能转换多个值,因此,+1.1。在最初的帖子中,它说
charstr[]=“345335”
等等,所以
str
不是
std::string
,而是一个没有方法
size()的字符数组
sizeof(str)
将以字节为单位给出该数组的大小,包括零分隔符,因此我将更正代码(
-1
)。2.你指的是哪个
功能
?如果它是
std::transform
的第四个参数,在您看来“不正确”:它是一个C++11 lambda,接受一个参数并返回一个字符。