我编写了一个C程序,将每个基数转换为另一个基数。但是当我要将ascii代码转换为数字时,我面临一个问题...... 请帮忙 :) 我认为我的问题是因为我无法将assci转换为数字,它说: ====>未明确引用`pow'
#include <stdio.h>
#include <math.h>
int CB, DB;
void base(void)
{
int adad2[100], i=-1,j;
char adad1[100], ch;
long int num1=0, num2=0;
printf("Enter your num: ");
scanf("%c", &ch);
do
{
i++;
scanf("%c", &adad1[i]);
} while(adad1[i]!='\n');
j=i-1;
for(i=j;i>=0;i--)
{ //converts the base to 10.
if(adad1[i]<='9'&& adad1[i]>='0')
{
num1+=((long int)pow((float)CB,(j-i)))*(((int)adad1[i])-48); //converting ascii code to num
}
else if(adad1[i]<='Z'&&adad1[i]>='A')
{
num1+=((long int)pow((float)CB,(j-i)))*(((int)adad1[i])-55);
}
else if(adad1[i]<='z'&&adad1[i]>='a')
{
num1+=((long int)pow((float)CB,(j-i)))*(((int)adad1[i])-87);
}
}
i=0;
while(num1>=DB)
{ //converts the base to b. (START)
adad2[i]=num1%DB;
i++;
num1/=DB;
}
adad2[i]=num1; //converts the base to b. (END)
printf("\nResult: \n");
for(;i>=0;i--)
{ //prints the result.
if(adad2[i]<=9&&adad2[i]>=0){
printf("%d",adad2[i]);
}
else if(adad2[i]>=10&&adad2[i]<=35){
printf("%c",(char)(adad2[i]+55));
}
}
}
void main(void)
{
printf("\nEnter current base: ");
scanf("%d", &CB);
printf("\nEnter desired base: ");
scanf("%d", &DB);
base();
}
答案 0 :(得分:1)
当您从编译器中收到错误时
undefined reference to `pow'
那么这意味着库函数没有与您的程序链接。为此,您必须包含包含pow
函数定义的标头。在GCC中使用lm
标志进行编译。它将包含<math.h>
标头,其中包含库函数pow
的定义。
答案 1 :(得分:0)
如果您使用的是gcc,则可能需要像这样编译:
gcc yourfile.c -o yourapp -lm
lm
选项链接数学库。
在旁注中,请勿使用void main
代替使用标准的内容:
int main(int argc, char *argv[])
答案 2 :(得分:0)
正如其他人已经指出的那样,您可以通过链接数学库来“解决”链接器错误。 但是,这不是您的主要问题。
浮点数是inherently inexact,因此 A Very Bad Idea(TM) 可以将它们与所谓的精确整数运算一起使用。如果对pow()
的调用返回的数字略小于基数的预期功效,那么,由于截断,您将得到错误的结果。
我建议你自己写一个整数幂函数,可以安全使用 e。 G:
unsigned long integer_pow(unsigned long base, unsigned long exp)
{
unsigned long res = 1;
while (exp--) {
res *= base;
}
return res;
}