c-将字符串更改为int

时间:2015-04-23 20:09:50

标签: c string int

我正在尝试将一串字符更改为数字。 例如字符串'5','3','9'到539。 我做的是:

for (j = 0; j < len_of_str; j++)
     num = num + ((str[j] - 48) * (10 ^ (len_of_str - j)))    
printf("%d", num);

num是将数字包含为int的数字,减去48是将ASCII中的值更改为与实数相似的数字。 并且(10 ^ (len_of_str - j))将值更改为数百,数千等......

3 个答案:

答案 0 :(得分:3)

几个问题:

首先,^不是C中的取幂运算符 - 它是一个按位异或运算符。而不是得到10 N ,你将得到10 XOR N,这不是你想要的。 C没有一个取幂运算符(对于定义了十一亿运算符的语言来说很讽刺,但是你去了) - 你需要使用库函数pow。或者你可以避免整个问题,而是这样做:

num = 0;
for ( j = 0; j < len_of_str; j++ )
{
  num *= 10;
  num += str[j] - 48;
}

其次,str[j]-48采用ASCII编码。为了使它更通用,请使用str[j] - '0'代替(在大多数编码中,数字字符是顺序的, 所以'9' - '0' 等于9)。

最后,您是否有理由不使用其中一个内置库函数,例如atoistrtol

num = (int) strtol( str, NULL, 0 );
printf( "num = %d\n", num );

答案 1 :(得分:0)

正如上面的评论所指出的那样,re.sub('[.*?]','BRAKCET',text) 实际上并没有计算出一个权力,而是做了一个逐点的异或(见wikipedia)。例如对于^,因为XOR只会将位设置为1,输入在该位中不同。

要计算c中的幂10,请使用0101 ^ 0111 == 0010中的pow(double x, double y)。有关详细信息,请参阅this post

答案 2 :(得分:0)

将数字序列转换为整数是将数字(整数或实数)解析为二进制整数或双精度值的更一般情况的特例。

一种方法是使用模式描述数字,您可以迭代地或递归地描述如下,

An integer_string is composed of:
    and optional '+' or '-' (sign)
    follwed by a digit_sequence
a digit_sequence is composed of:
    digit ('0', '1', '2', '3', ..., '9')
    followed by an optional (recursive) digit_sequence

这可以使用Backus-Naur形式主义编写,

integer_string := { '+' | '-' } digit_sequence
digit_sequence := digit { digit_sequence }
digit := [ '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ]

如果您愿意,可以扩展以上内容以识别实数,

real_number := integer_string { '.' { digit_sequence } }
               { [ 'e' | 'E' ] integer_string }

虽然上面的内容不太正确,因为它会强制小数点前的数字(修复程序留给读者练习)。

一旦你拥有Backus-Naur形式主义,很容易识别构成模式的符号,以及实际转换为整数的语义行为

long int
atol_self(char* str)
{
    if(!str) return(0);
    //accumulator for value
    long int accum=0; //nothing yet
    //index through the string
    int ndx=0;
    //handle the optional sign
    int sign=1;
    if ( str[ndx=0] == '+' ) { sign=1; ndx+=1; }
    else if ( str[ndx=0] == '+' ) { sign=1; ndx+=1; }
    for( ; str[ndx] && isdigit(str[ndx]); ) {
        int digval = str[ndx] - '0';
        accum = accum*10 + digval;
        ++ndx;
    }
    return(accum*sign);
}