當前位置:首頁 » 編程語言 » c語言怎麼寫庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎麼寫庫

發布時間: 2022-12-08 01:12:19

❶ 怎麼在c語言中自己寫庫函數

你VC 中的 文件 新建 有個 新建頭文件.h開頭的 不是源文件 就可以了 到時候就可以引用你自己寫的東西了

❷ c語言怎麼編寫

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

char fun(char *a,char *b)

{

char *t;

strcpy(t,a);

strcpy(a,b);

strcpy(b,t);

}

struct st{

char a[6][20];

};

int main()

{

struct st s[111];

int n,x[111],k=0,ts,sum=0;

scanf("%d",&n);

printf("學號 姓名 數學 物理 英語 計算機 ");

for(int i=0;i<n;i++)

{

sum=0;

for(int j=0;j<6;j++)

{

scanf("%s",s[i].a[j]);

if(j!=0&&j!=1)

{

sum+=atoi(s[i].a[j]);

}

}

x[k++]=sum/3;

}

for(int i=0;i<k;i++)

{

for(int j=0;j<k-i-1;j++)

{

if(x[j]>x[j+1])

{

ts=x[j];

x[j]=x[j+1];

x[j+1]=ts;

for(int l=0;l<6;l++)

fun(s[j].a[l],s[j+1].a[l]);

}

}

}

printf("學號 姓名 數學 物理 英語 計算機 平均成績 ");

for(int i=0;i<n;i++)

{

for(int j=0;j<6;j++)

{

printf("%s",s[i].a[j]);

for(int k=0;k<8-strlen(s[i].a[j]);k++)

printf(" ");

}

printf("%8d ",x[i]);

}

return 0;

}

❸ 如何用C語言編寫資料庫

可以用來編寫
層次型資料庫
和網狀資料庫
現在美國的幾家大型公司還在用c語言編寫的層次型的資料庫
雖然關系型資料庫使用相當廣泛但是
在一些具體的場合
速度都跟不上去,處理效率不高
同志的用c語言編寫的

你的勇氣可佳
好好乾將來必有前途

❹ c語言中怎樣建立自己的lib庫呀請教

你編譯完DLL之後能到編譯好的Dll目錄中找到對應的lib文件。

❺ C語言函數庫怎麼建

C語言標准函數庫不是跟編程軟體相關的。C語言的標准變化了好幾次,現在說的標准C語言指的是99年制定的C99標准。其中定義的函數庫就是C語言標准函數庫。具體有哪些你可以查詢《C語言參考手冊(C:A
Reference
Manual,Fifth
Edition》。
但事實上,每個C/C++編譯器都帶有自身的函數庫,一般都兼容C標准函數庫,但也有個別的有些細節上的出入。所以,一般你只要考察你所用編譯器的函數庫就行了(通常都可以從幫助中得到)。

❻ 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 (flags & FL_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卻沒有。其中的原因是,在K&RC下,float值用於表達式或用作參數前,會自動轉換成double類型。而ANSI C一般不會自動把float轉換成double。有些程序已假定其中的float參數會被轉換成double,為了保護大量這樣的程序,所有printf()函數的float參數還是被自動轉換成double型。因此,在K&RC或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語言中如何創建自己的庫函數能不能再詳細的解釋一下,謝謝了!!!

哈哈,選我吧!庫分靜態庫和動態鏈接庫,靜態庫以lib結尾,被編譯器里的鏈接器識別。windows下動態庫以dll結尾,被操作系統載入以模塊方式映射到進程地址空間。一般初學者先學會創建的是靜態庫。靜態庫是一個無需重定位的函數集。怎麼做到無需重定位呢?這是編譯器做的編譯工作,例如它指定開頭的位置作為基址,剩下的代碼用到的都是相對偏移。這樣,這段二進制代碼可以被放在內存中的任何位置執行,被寫入了lib文件里。在lib文件里,包含了函數名與函數地址組成的結構體,通過它編譯器可以找到lib文件里需要的二進制代碼並以靜態聯編的方式寫入我們調用它的exe文件里。這種代碼是被塞進exe文件里而無需修改,並在程序執行時被用到。為了讓庫被別人調用,我們可以寫一個頭文件.h,包含函數原型及聲明。

❽ C語言:如何自己做庫函數

簡單的一個例子,但是基本的程序編譯的思想都在裡面了,具體的需要你自己體會和查資料
跟著下面的步驟走
------------------------
第一步:我的電腦-屬性-高級-環境變數
添加3個變數
1.名字:path 值:vc的安裝目錄裡麵包含cl.exe的bin目錄路徑+";"+vc目錄下包含mspdb80.dll的目錄的路徑
比如我的是D:\Program Files\Microsoft Visual Studio 8\VC\bin;D:\Program Files\Microsoft Visual Studio 8\Common7\IDE;
2.名字:include 值:vc安裝目錄下的include目錄,主要是為了找到頭文件,我的是D:\Program Files\Microsoft Visual Studio 8\VC\include;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include;
3.名字:lib 值:vc目錄下包含庫文件的目錄路徑
我的是D:\Program Files\Microsoft Visual Studio 8\VC\lib;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib;
第二步:需要下面兩個文件
//-------------libdemo.c
#include <stdio.h>

void lib_func()
{
printf("this routine in lib\n");

}
//------------main.c
void lib_func();
int main(int argc, char *argv[])
{
lib_func();
}

第三步:命令
cl /c libdemo.c '編譯libdemo.c 生成libdemo.obj
lib libdemo.obj '生成libdemo.lib 庫文件

cl /c main.c '編譯main.c
link main.obj libdemo.lib '生成main.exe

---------------------------------------------------
呵呵 加點東西,參看4樓的建議,在做個dll,COM組件就不做了,有點復雜了
1。把libdemo.c 稍微改下
//-------------libdemo.c
#include <stdio.h>

__declspec (dllexport) void lib_func()
{
printf("this routine in lib\n");

}
2。命令
cl /c libdemo.c main.c
link libdemo.obj /dll '生成libdemo.lib
link main.obj libdemo.lib

❾ 如何製作一個c語言函數庫

一、lib庫的創建;
建議使用VC來製作比較方便,以VC2005為例:
新建》項目》Win32控制台應用程序》靜態庫》完成。
然後在裡面編寫一個函數,編譯一下庫就作好了。
把對外使用的函數新建一個頭文件聲明;
二、lib庫的使用
新建一個程序,然後引用上面的頭文件,就可以使用庫里的函數。然後把lib庫在工程配置裡面加入:屬性》鏈接器》輸入》附加依賴項》填入你的lib庫,可以加路徑。然後編譯應該就可以了。
祝 你 好 運!

❿ C語言中,如何自己定義一個庫函數

1、存為xx.h文件放在自創的文件夾下,聲明#include「xx.h」 2、還可以存為xx.h文件直接與系統庫文件放一起,聲明#include<xx.h>(這樣會快些)