C语言面试必备:50个核心库及实战应用解析
C语言作为一门历史悠久且广泛使用的编程语言,其在面试中占据着重要的地位。掌握C语言的核心库及其实战应用,对于面试者来说至关重要。本文将详细介绍50个C语言核心库及其在实战中的应用,帮助面试者更好地准备面试。
1. 标准输入输出库(stdio.h)
标准输入输出库是C语言中最基础的库之一,用于处理标准输入输出。以下是一些常见的应用场景:
printf和scanf函数:用于格式化输出和输入数据。getchar和putchar函数:用于读取和输出单个字符。
#include <stdio.h> int main() { int a; printf("请输入一个整数:"); scanf("%d", &a); printf("您输入的整数是:%dn", a); return 0; } 2. 字符串处理库(string.h)
字符串处理库提供了丰富的字符串操作函数,如:
strlen函数:计算字符串长度。strcpy和strncpy函数:复制字符串。strcmp函数:比较两个字符串。
#include <stdio.h> #include <string.h> int main() { char str1[] = "Hello"; char str2[] = "World"; printf("字符串长度:%lun", strlen(str1)); strcpy(str1, str2); printf("复制后的字符串:%sn", str1); return 0; } 3. 动态内存分配库(stdlib.h)
动态内存分配库提供了动态内存管理的功能,如:
malloc和calloc函数:分配内存。realloc函数:重新分配内存。free函数:释放内存。
#include <stdio.h> #include <stdlib.h> int main() { int *arr = (int *)malloc(5 * sizeof(int)); for (int i = 0; i < 5; i++) { arr[i] = i; } for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } free(arr); return 0; } 4. 数学库(math.h)
数学库提供了各种数学运算函数,如:
sin、cos和tan函数:计算正弦、余弦和正切值。sqrt函数:计算平方根。pow函数:计算幂运算。
#include <stdio.h> #include <math.h> int main() { double a = 3.14; printf("sin(%.2f) = %.2fn", a, sin(a)); printf("cos(%.2f) = %.2fn", a, cos(a)); printf("tan(%.2f) = %.2fn", a, tan(a)); return 0; } 5. 时间库(time.h)
时间库提供了时间相关的函数,如:
time函数:获取当前时间。localtime函数:将时间转换为本地时间。strftime函数:格式化时间。
#include <stdio.h> #include <time.h> int main() { time_t t = time(NULL); struct tm *tm = localtime(&t); char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm); printf("当前时间:%sn", buffer); return 0; } 6. 动态链接库(dlfcn.h)
动态链接库允许在程序运行时动态加载和卸载库。以下是一些常见的应用场景:
dlopen函数:打开动态链接库。dlsym函数:获取动态链接库中的符号。dlclose函数:关闭动态链接库。
#include <stdio.h> #include <dlfcn.h> int main() { void *handle = dlopen("./libexample.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "无法加载动态链接库:%sn", dlerror()); return 1; } int (*add)(int, int) = dlsym(handle, "add"); if (!add) { fprintf(stderr, "无法获取函数add:%sn", dlerror()); dlclose(handle); return 1; } printf("2 + 3 = %dn", add(2, 3)); dlclose(handle); return 0; } 7. 网络编程库(socket.h)
网络编程库提供了网络通信相关的函数,如:
socket函数:创建套接字。bind函数:绑定套接字到端口。listen函数:监听套接字。accept函数:接受连接请求。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8080); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } char buffer[1024] = {0}; read(new_socket, buffer, 1024); printf("Client said: %sn", buffer); send(new_socket, "Hello from server", 18, 0); close(new_socket); close(server_fd); return 0; } 8. 图形库(OpenGL)
OpenGL是一个广泛使用的图形库,可以用于创建2D和3D图形。以下是一些常见的应用场景:
glut库:用于创建窗口和绘制图形。GLFW库:用于创建窗口和输入处理。GLM库:用于矩阵和向量运算。
#include <GL/glut.h> #include <stdio.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex2f(0.0, 0.0); glVertex2f(0.5, -0.5); glVertex2f(-0.5, -0.5); glEnd(); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 400); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL Triangle"); glutDisplayFunc(display); glutMainLoop(); return 0; } 9. 文件操作库(fopen.h)
文件操作库提供了文件读写相关的函数,如:
fopen函数:打开文件。fclose函数:关闭文件。fread和fwrite函数:读写文件数据。
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w+"); if (!fp) { perror("无法打开文件"); return 1; } fprintf(fp, "Hello, world!n"); fseek(fp, 0, SEEK_SET); char buffer[1024]; fread(buffer, sizeof(char), 1024, fp); printf("读取的内容:%sn", buffer); fclose(fp); return 0; } 10. 线程库(pthread.h)
线程库提供了创建和管理线程的功能,如:
pthread_create函数:创建线程。pthread_join函数:等待线程结束。pthread_detach函数:分离线程。
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *thread_func(void *arg) { printf("线程 %ld 开始执行n", (long)arg); sleep(1); printf("线程 %ld 结束执行n", (long)arg); return NULL; } int main() { pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_func, (void *)1); pthread_create(&thread2, NULL, thread_func, (void *)2); pthread_join(thread1, NULL); pthread_join(thread2, NULL); return 0; } 11. 网络编程库(libevent)
libevent是一个异步事件处理库,可以用于网络编程和定时任务。以下是一些常见的应用场景:
evloop:事件循环。evdns:DNS查询。evhttp:HTTP客户端和服务器。
#include <stdio.h> #include <event.h> #include <evhttp.h> void http_callback(struct evhttp_request *req, void *arg) { struct evbuffer *buf = evhttp_request_get_output_buffer(req); evbuffer_add_printf(buf, "Hello, world!n"); evhttp_send_reply(req, HTTP_OK, "text/plain", buf); } int main() { struct event_base *base = event_base_new(); struct evhttp *http = evhttp_new(base); evhttp_bind_socket(http, "0.0.0.0", 8080); evhttp_set_gencb(http, http_callback, NULL); event_base_dispatch(base); evhttp_free(http); event_base_free(base); return 0; } 12. XML解析库(libxml2)
libxml2是一个广泛使用的XML解析库,可以用于解析和生成XML文档。以下是一些常见的应用场景:
xmlParseFile函数:解析XML文件。xmlSaveFormatFile函数:保存XML文档。
#include <libxml/xmlparse.h> #include <libxml/xmlmemory.h> #include <stdio.h> int main() { xmlDoc *doc = xmlParseFile("example.xml"); if (!doc) { perror("无法解析XML文件"); return 1; } xmlSaveFormatFile("example_copy.xml", doc, NULL); xmlFreeDoc(doc); return 0; } 13. JSON解析库(json-c)
json-c是一个广泛使用的JSON解析库,可以用于解析和生成JSON文档。以下是一些常见的应用场景:
json_object_new_object函数:创建JSON对象。json_object_object_add函数:添加属性到JSON对象。json_object_to_json_string函数:将JSON对象转换为字符串。
#include <json-c/json.h> int main() { json_object *obj = json_object_new_object(); json_object_object_add(obj, "name", json_object_new_string("张三")); json_object_object_add(obj, "age", json_object_new_int(18)); char *str = json_object_to_json_string(obj); printf("JSON字符串:%sn", str); free(str); return 0; } 14. 数据库连接库(libmysqlclient)
libmysqlclient是一个MySQL数据库连接库,可以用于连接和操作MySQL数据库。以下是一些常见的应用场景:
mysql_init函数:初始化MySQL连接。mysql_real_connect函数:连接到MySQL数据库。mysql_query函数:执行SQL查询。
#include <mysql.h> int main() { MYSQL *conn = mysql_init(NULL); if (!mysql_real_connect(conn, "localhost", "root", "password", "database", 0, NULL, 0)) { perror("连接数据库失败"); return 1; } char *sql = "SELECT * FROM users"; if (mysql_query(conn, sql)) { perror("执行查询失败"); return 1; } MYSQL_RES *result = mysql_use_result(conn); MYSQL_FIELD *field = mysql_fetch_field(result); while (field) { printf("%s ", field->name); field = mysql_fetch_field(result); } printf("n"); while ((row = mysql_fetch_row(result))) { for (int i = 0; i < mysql_num_fields(result); i++) { printf("%s ", row[i]); } printf("n"); } mysql_free_result(result); mysql_close(conn); return 0; } 15. HTTP客户端库(libcurl)
libcurl是一个广泛使用的HTTP客户端库,可以用于发送HTTP请求和接收HTTP响应。以下是一些常见的应用场景:
curl_easy_init函数:初始化libcurl。curl_easy_setopt函数:设置libcurl选项。curl_easy_perform函数:执行HTTP请求。
#include <stdio.h> #include <curl/curl.h> void callback(void *clientp, curl_off_t dldt, curl_off_t ult) { printf("下载进度:%ld/%ldn", dldt, ult); } int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &dldt); res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %sn", curl_easy_strerror(res)); } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; } 16. 文件加密库(libgcrypt)
libgcrypt是一个广泛使用的加密库,可以用于加密和解密数据。以下是一些常见的应用场景:
gcry_cipher_open函数:创建加密操作。gcry_cipher_setkey函数:设置加密密钥。gcry_cipher_encrypt函数:加密数据。
#include <stdio.h> #include <gcrypt.h> int main() { gcry_cipher_hd_t hd; unsigned char key[16] = "1234567890123456"; unsigned char plaintext[] = "Hello, world!"; unsigned char ciphertext[1024]; size_t ciphertext_len; if (gcry_cipher_open(&hd, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB, 0) != 0) { perror("无法打开加密操作"); return 1; } if (gcry_cipher_setkey(hd, key, 16) != 0) { perror("无法设置加密密钥"); return 1; } if (gcry_cipher_encrypt(hd, ciphertext, sizeof(ciphertext), plaintext, sizeof(plaintext), &ciphertext_len) != 0) { perror("加密失败"); return 1; } printf("加密后的数据:%.*sn", ciphertext_len, ciphertext); gcry_cipher_close(hd); return 0; } 17. 网络编程库(libevent)
libevent是一个异步事件处理库,可以用于网络编程和定时任务。以下是一些常见的应用场景:
evloop:事件循环。evdns:DNS查询。evhttp:HTTP客户端和服务器。
#include <stdio.h> #include <event.h> #include <evhttp.h> void http_callback(struct evhttp_request *req, void *arg) { struct evbuffer *buf = evhttp_request_get_output_buffer(req); evbuffer_add_printf(buf, "Hello, world!n"); evhttp_send_reply(req, HTTP_OK, "text/plain", buf); } int main() { struct event_base *base = event_base_new(); struct evhttp *http = evhttp_new(base); evhttp_bind_socket(http, "0.0.0.0", 8080); evhttp_set_gencb(http, http_callback, NULL); event_base_dispatch(base); evhttp_free(http); event_base_free(base); return 0; } 18. XML解析库(libxml2)
libxml2是一个广泛使用的XML解析库,可以用于解析和生成XML文档。以下是一些常见的应用场景:
xmlParseFile函数:解析XML文件。xmlSaveFormatFile函数:保存XML文档。
#include <libxml/xmlparse.h> #include <libxml/xmlmemory.h> #include <stdio.h> int main() { xmlDoc *doc = xmlParseFile("example.xml"); if (!doc) { perror("无法解析XML文件"); return 1; } xmlSaveFormatFile("example_copy.xml", doc, NULL); xmlFreeDoc(doc); return 0; } 19. JSON解析库(json-c)
json-c是一个广泛使用的JSON解析库,可以用于解析和生成JSON文档。以下是一些常见的应用场景:
json_object_new_object函数:创建JSON对象。json_object_object_add函数:添加属性到JSON对象。json_object_to_json_string函数:将JSON对象转换为字符串。
#include <json-c/json.h> int main() { json_object *obj = json_object_new_object(); json_object_object_add(obj, "name", json_object_new_string("张三")); json_object_object_add(obj, "age", json_object_new_int(18)); char *str = json_object_to_json_string(obj); printf("JSON字符串:%sn", str); free(str); return 0; } 20. 数据库连接库(libmysqlclient)
libmysqlclient是一个MySQL数据库连接库,可以用于连接和操作MySQL数据库。以下是一些常见的应用场景:
mysql_init函数:初始化MySQL连接。mysql_real_connect函数:
支付宝扫一扫
微信扫一扫