c语言怎么使用库函数 c语言怎么调用库

如何在我的C语言程序中插入库函数int add(int x,int y);
int sub(int x,int y);
int mul(int x,int y);
int div(int x,int y);
#include math.h
#include stdio.h
void main()
{
int a,b,c,d,e,f,g,h,i;
printf("XXXXXXXXXXXXXXX计算器");
printf("\n");
for(c=1;c=30;c)
printf("*");
printf("\n");
printf("请输入一个整数");
printf("\n");
scanf("%d",a);
printf("\n");
for(c=1;c=30;c)
printf("-");
printf("\n");
printf("请选择您要做c语言怎么使用库函数的运算:1. ,2.-,3.*,4./5.abs,6.sqrt");
printf("\n");
for(c=1;c=30;c)
printf("*");
printf("\n");
scanf("%d",d);
printf("\n");
if(d==5) {printf("%d",abs(a));goto end;}(如果想做绝对值,就直接做abs函数(它是个库函数).做完后就goto"end"--也就是函数c语言怎么使用库函数的最后.)
if(d==6) {printf("%.2f",sqrt(a));goto end;};}(如果想做开平方,就直接做sqrt函数(它是个库函数).做完后就goto"end"--也就是函数c语言怎么使用库函数的最后.)
printf("请再次输入一个整数"); (如果是做双目c语言怎么使用库函数的就开始输入第二个数b)
printf("\n");
scanf("%d",b);
printf("\n");
switch(d)
{
case 1:add(a,b);break;
case 2:sub(a,b);break;
case 3:mul(a,b);break;
case 4:div(a,b);break;
default:printf("date input error!\n");
} end: printf("\n");}
int add(int x,int y)
{
int m;
m=x y;
printf("%d",m);
return m;
}
int sub(int x,int y)
{
int m;
m=x-y;
printf("%d",m);
return m;
}
int mul(int x,int y)
{
int m;
m=x*y;
printf("%d",m);
return m;
}
int div(int x,int y)
{
int m;
m=x/y;
printf("%d",m);
return m;
}
(c语言怎么使用库函数你试试看吧!应该可以!呵呵)
c语言调用库函数用什么命令您好 , 很高兴回答您的问题 。
在c语言中,专门建立有一组需要经常使用、但是编写起来不太简单的函数,系统把这些功能载入到软件内容 。普通用户所需要使用时,只需要按照规定输入正确的调用语句,即可打开并运行谢谢文件 。打开的格式为#include对应文件名,如打开输入输出函数为#includestdio. h 。
C语言库函数如何编写?/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//断言宏 。如果输出格式字符串指针为空,则在DEBUG版下断言,报告错误 。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定输出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上为printf()的源代码
1、从含有可选参数函数中获得可选参数,以及操作这些参数
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函数含有一个必选参数和多个可选参数,必选参数声明为普通数据类型 , 且能通过参数名来获得该变量的值 。可选参数通过宏va_start、va_arg和va_end(定义在stdarg.h或varargs.h中)来进行操作,即通过设置指向第一个可选参数指针、返回当前参数、在返回参数后重新设置指针来操作所有的可选参数 。
va_start:为获取可变数目参数的函数的参数提供一种便捷手段 。设置arg_ptr为指向传给函数参数列表中的第一个可选参数的指针 , 且该参数必须是va_list类型 。prev_param是在参数列表中第一个可选参数前的必选参数 。
va_arg:返回由arg_ptr所指向的参数的值,且自增指向下一个参数的地址 。type为当前参数的类型 , 用来计算该参数的长度,确定下一个参数的起始位置 。它可以在函数中应用多次,直到得到函数的所有参数为止,但必须在宏va_start后面调用 。
va_end:在获取所有的参数后,设置指针arg_ptr为NULL 。
下面举例说明:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum= i;
count;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值为:
Average is: 3
Average is: 8
Average is: 0
综上所述 , 在printf()函数中,可以只输出一个字符串,也可按照一定的形式输出含有多个可选参数的字符串信息 。因此,首先就要通过这些宏来获取所有的可选参数 。在上面的源码可以看出printf()中,只使用了宏at_start,将可选参数的首地址赋给了arglist 。
2、锁定字符串及输出字符串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函数中,读取格式字符串中的每一个字符,然后对其进行处理,处理方式根据每一个字符所代表的意义来进行,如:普通字符直接利用函数WRITE_CHAR(ch, charsout);输出到控制台 。
其中的主要部分是对转换说明符(d,c,s,f)的处理,现在将对其中的部分代码进行详细说明,这里只说明最基本的转换说明符,对这些须基本的转换说明符进行修饰的修饰符,程序中单独进行处理 。下面是函数output()(output.c)部分源代码:
case ST_TYPE:
//表示当前处理的字符的类型为转换说明符 。
...
switch (ch) {
//下面对参数的获取都是利用宏va_arg( va_list arg_ptr, type );来进行的 。
case ''c'': {
//从参数表中获取单个字符,输出到缓冲字符串中 , 此时,type=int
buffer[0] = (char) get_int_arg(argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//从参数表中获取字符串,输出到缓冲字符串中,此时,type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(argptr);
...
}
break;
case ''w'': {
//对宽字符进行处理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//对浮点数进行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flagsFL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//对长双精度型进行处理,此时,type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//对双精度型进行处理,此时 , type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//对整型变量处理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
注:对于浮点型double和long double,有相应的转换说明符(%f表示双精度型,%lf表示长双精度型),而float却没有 。其中的原因是,在KRC下,float值用于表达式或用作参数前 , 会自动转换成double类型 。而ANSI C一般不会自动把float转换成double 。有些程序已假定其中的float参数会被转换成double,为了保护大量这样的程序,所有printf()函数的float参数还是被自动转换成double型 。因此,在KRC或ANSI C下,都无需用特定的转换说明符来显示float型 。
综上所述,转换说明符必须与待打印字符的类型 。通常 , 用户有种选择 。例如,如要打印一个int类型的值 。则只可以使用%d,%x或%o 。所有这些说明符都表示要打印一个int类型的值;它们只不过提供了一个数值的几种不同表示 。类似一,可以用%f、%g和%e来表示double类型的值 。但如果转换说明与类型不匹配,将会出现意想不到的结果 。为什么呢?问题就在于C向函数传递信息的方式 。
这个失败的根本细节与具体实现相关 。它决定了系统中的参数以何方式传递 。函数调用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
这个调用告诉计算机,要把变量n1,n2,n3和n4的值交给计算机,它把这些变量放进称作栈(stack)的内存区域中,来完成这一任务 。计算机把这些值放进栈中,其根据是变量的类型而不是转换说明符 , 比如n1,把8个字节放入栈中(float被转换成double) , 类似地 , 为n2放了8字节,其后给n3和n4各放了4个字节 。接着,控制的对象转移到printf();此函数从栈中读数,不过在这一过程中,它是在转换说明符的指导下,读取数值的 。说明符%ld指定printf()应读4个字节(va_arg( va_list arg_ptr, type )中type=long),因此printf()读入栈中的4个字节,作为它的第一个值 。但是这只是n1的前半部分,这个值被看成一个long整数 。下一个说明符%ld读入4个字节,这正是n1的后半部分 , 这个值被看成第二个long整数 。类似地,第三、第四次又读入n2的前后两部分 。因此,尽管我们对n3和n4使用了正确的说明符,printf()仍然会产生错误 。
c语言怎么调用库函数求函数值镅栽趺词褂每夂翰恢付矶萩语言怎么使用库函数,整数部分全部输出并输出6位小数 。
%m.nfc语言怎么使用库函数:输出共占m列c语言怎么使用库函数,其中有n位小数,如数值宽度小于m左端补空格 。
%-m.nf:输出共占m列,其中有n位小数,如数值宽度小于m右端补空格 。
C语言库函数假定你是在linux下做这件事 (在windows下应该也是类似的)
假定你要产生的库名字为 libtest.a
1. 实现库函数于 test.c
#include stdio.h
int test()
{
printf("hello world!\n");
return 0;
}
test.h内容:
extern int test();
2. 编译test.c并产生库文件
gcc -c test.c
ar -r libtest.a test.o
3. 其他程序如何调用 libtest.a 里的 test()函数?
main.c
#include "test.h"
int main()
{
return test();
}
4. 编译main.c产生可执行文件
gcc -o main.out main.c -L/path/to/libtest -ltest
5. 运行 main.out
./main.out
PS, 头文件的用处无非就是提供函数原型声明,在我上面给的例子中,可以把 test.h 删除 , 但是必须在 main.c 里自己加上 extern int test(); 来声明函数 。
【c语言怎么使用库函数 c语言怎么调用库】关于c语言怎么使用库函数和c语言怎么调用库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读