我正在尝试将一串字符更改为数字。 例如字符串'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))
将值更改为数百,数千等......
答案 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)。
最后,您是否有理由不使用其中一个内置库函数,例如atoi
或strtol
?
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);
}