C语言必背100代码系列文章-第五篇:数据结构实现

C语言必背100代码系列文章目录

第一篇:基础语法与入门必背代码

    核心内容:Hello World、条件判断、循环结构、数组基础、函数定义等。

第二篇:数组与字符串操作

   核心内容:数组排序、字符串处理、多维数组、字符匹配、内存拷贝等。

第三篇:指针与内存管理

核心内容:指针运算、动态内存分配、结构体指针、函数指针、内存泄漏检测等。

第四篇:递归与算法

核心内容:阶乘递归、汉诺塔、分治算法、回溯算法、动态规划基础等。

第五篇:数据结构实现

核心内容:链表、栈、队列、二叉树、哈希表、图的基本操作。

第六篇:文件操作与IO

核心内容:文本文件读写、二进制文件操作、日志管理、CSV/JSON解析等。

第七篇:数学与算法进阶

核心内容:快速幂、素数测试、进制转换、矩阵运算、蒙特卡洛模拟等。

第八篇:系统编程与底层开发

核心内容:进程控制、线程同步、信号处理、套接字编程、系统调用封装等。

第九篇:网络编程进阶

核心内容:TCP/UDP通信、HTTP请求、WebSocket、SSL/TLS加密、网络抓包等。

第十篇:综合项目与工具


第五篇:数据结构实现

想系统掌握C语言网络开发?这篇硬核教程带你从零构建TCP/UDP通信框架,破解HTTP协议实现原理!通过10个实战案例+源码级解析,深度揭秘Socket编程、多线程服务器、广播通信等核心技术。从三次握手细节到字节序转换陷阱,从简易聊天室到HTTP客户端开发,本文涵盖网络编程全链路。无论你是刚接触Socket的萌新,还是想优化网络模块的工程师,这篇覆盖TCP粘包处理、UDP广播实战、端口扫描原理等干货的进阶指南,都能让你的网络开发能力实现质的突破!

1. TCP客户端(连接服务器并发送数据)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define PORT 8080

#define BUFFER_SIZE 1024

int main() {

int sock = 0;

struct sockaddr_in serv_addr;

char buffer[BUFFER_SIZE] = {0};

// 创建Socket

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

perror("Socket creation error");

return -1;

}

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(PORT);

// 转换IP地址(示例:127.0.0.1)

if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {

perror("Invalid address/Address not supported");

return -1;

}

// 连接服务器

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {

perror("Connection Failed");

return -1;

}

// 发送数据

const char *message = "Hello from client!";

send(sock, message, strlen(message), 0);

printf("Message sent: %s\n", message);

// 接收响应

read(sock, buffer, BUFFER_SIZE);

printf("Server response: %s\n", buffer);

close(sock);

return 0;

}

  • 详细注释:
    • socket():创建Socket(AF_INET表示IPv4,SOCK_STREAM表示TCP)。
    • inet_pton():将点分十进制IP转为二进制格式。
    • connect():阻塞式连接,超时需设置SO_RCVTIMEO选项。
  • 应用场景:客户端工具(如HTTP请求、即时通讯)。
  • 常见问题:
    • 服务器未启动导致connect()失败。
    • 缓冲区溢出(需检查read()返回值)。

2. TCP服务器(多线程处理客户端)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <pthread.h>

#define PORT 8080

#define BUFFER_SIZE 1024

void *handleClient(void *arg) {

int clientSock = *(int *)arg;

char buffer[BUFFER_SIZE] = {0};

read(clientSock, buffer, BUFFER_SIZE);

printf("Received: %s\n", buffer);

const char *response = "Hello from server!";

send(clientSock, response, strlen(response), 0);

close(clientSock);

return NULL;

}

int main() {

int serverSock, clientSock;

struct sockaddr_in address;

int opt = 1;

int addrlen = sizeof(address);

// 创建Socket

if ((serverSock = socket(AF_INET, SOCK_STREAM, 0)) == 0) {

perror("Socket failed");

exit(EXIT_FAILURE);

}

// 设置Socket选项(允许地址重用)

if (setsockopt(serverSock, 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(PORT);

// 绑定Socket

if (bind(serverSock, (struct sockaddr *)&address, sizeof(address)) < 0) {

perror("Bind failed");

exit(EXIT_FAILURE);

}

// 监听

if (listen(serverSock, 3) < 0) {

perror("Listen");

exit(EXIT_FAILURE);

}

printf("Server listening on port %d...\n", PORT);

while (1) {

// 接受客户端连接

if ((clientSock = accept(serverSock, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {

perror("Accept");

continue;

}

printf("Client connected: %s:%d\n",

inet_ntoa(address.sin_addr), ntohs(address.sin_port));

// 创建线程处理客户端

pthread_t tid;

if (pthread_create(&tid, NULL, handleClient, &clientSock) < 0) {

perror("Thread creation failed");

close(clientSock);

continue;

}

pthread_detach(tid); // 分离线程,避免资源泄漏

}

return 0;

}

  • 详细注释:
    • setsockopt():设置SO_REUSEADDR避免端口占用。
    • pthread_create():为每个客户端创建独立线程。
    • pthread_detach():线程退出时自动释放资源。
  • 应用场景:Web服务器、聊天室。
  • 扩展知识:
    • 使用线程池(如pthread_pool)优化性能。
    • 添加SSL/TLS加密(如OpenSSL库)。

3. UDP客户端(发送广播消息)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define PORT 8888

#define BUFFER_SIZE 1024

int main() {

int sock = 0;

struct sockaddr_in serv_addr;

char buffer[BUFFER_SIZE] = {0};

// 创建UDP Socket

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

perror("Socket creation error");

return -1;

}

// 启用广播选项

int broadcastEnable = 1;

if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)) < 0) {

perror("setsockopt (SO_BROADCAST)");

return -1;

}

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(PORT);

serv_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); // 广播地址

// 发送广播消息

const char *message = "This is a broadcast message!";

sendto(sock, message, strlen(message), 0,

(const struct sockaddr *)&serv_addr, sizeof(serv_addr));

printf("Broadcast message sent: %s\n", message);

close(sock);

return 0;

}

  • 详细注释:
    • SOCK_DGRAM:UDP协议。
    • SO_BROADCAST:允许发送广播包。
    • 255.255.255.255:本地广播地址(需在子网内有效)。
  • 应用场景:局域网设备发现(如打印机、游戏服务器)。
  • 常见问题:
    • 路由器可能禁止广播包转发。
    • 防火墙可能拦截UDP端口。

4. UDP服务器(接收广播消息)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define PORT 8888

#define BUFFER_SIZE 1024

int main() {

int sock = 0;

struct sockaddr_in serv_addr, cli_addr;

char buffer[BUFFER_SIZE] = {0};

socklen_t addrlen = sizeof(cli_addr);

// 创建UDP Socket

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

perror("Socket creation error");

return -1;

}

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = INADDR_ANY;

serv_addr.sin_port = htons(PORT);

// 绑定Socket

if (bind(sock, (const struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {

perror("Bind failed");

return -1;

}

printf("UDP server listening on port %d...\n", PORT);

while (1) {

// 接收消息

int n = recvfrom(sock, buffer, BUFFER_SIZE, 0,

(struct sockaddr *)&cli_addr, &addrlen);

buffer[n] = '\0';

printf("Received from %s:%d: %s\n",

inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), buffer);

}

close(sock);

return 0;

}

  • 详细注释:
    • recvfrom():接收UDP数据包并返回发送方地址。
    • INADDR_ANY:监听所有网络接口。
  • 应用场景:网络监控、实时数据采集。
  • 扩展知识:
    • 多播(Multicast)替代广播(减少网络负担)。
    • 使用epoll(Linux)处理高并发UDP连接。

5. HTTP GET请求(Socket实现)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define PORT 80

#define BUFFER_SIZE 4096

int main() {

int sock = 0;

struct sockaddr_in serv_addr;

char buffer[BUFFER_SIZE] = {0};

// 创建Socket

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

perror("Socket creation error");

return -1;

}

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(PORT);

// 解析域名(示例:example.com)

struct hostent *host = gethostbyname("example.com");

if (host == NULL) {

perror("Host not found");

return -1;

}

memcpy(&serv_addr.sin_addr, host->h_addr, host->h_length);

// 连接服务器

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {

perror("Connection Failed");

return -1;

}

// 发送HTTP GET请求

const char *request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";

send(sock, request, strlen(request), 0);

// 接收响应

int bytesRead;

while ((bytesRead = read(sock, buffer, BUFFER_SIZE - 1)) > 0) {

buffer[bytesRead] = '\0';

printf("%s", buffer); // 输出HTML内容

}

close(sock);

return 0;

}

  • 详细注释:
    • gethostbyname():解析域名(需包含<netdb.h>)。
    • HTTP请求格式:GET / HTTP/1.1\r\nHost: ...\r\n\r\n。
  • 应用场景:爬虫、API调用。
  • 常见问题:
    • 服务器可能关闭连接(需处理Connection: close)。
    • 大响应需分块处理(避免缓冲区溢出)。

6. 域名解析(gethostbyname)

c

#include <stdio.h>

#include <stdlib.h>

#include <netdb.h>

#include <arpa/inet.h>

int main() {

const char *hostname = "example.com";

struct hostent *host = gethostbyname(hostname);

if (host == NULL) {

perror("Host not found");

return 1;

}

printf("Official name: %s\n", host->h_name);

printf("IP addresses:\n");

for (int i = 0; host->h_addr_list[i] != NULL; i++) {

char *ip = inet_ntoa(*(struct in_addr *)host->h_addr_list[i]);

printf(" %s\n", ip); // 输出:93.184.216.34等

}

return 0;

}

  • 详细注释:
    • hostent结构体:包含主机名、别名列表、IP地址列表。
    • h_addr_list:以NULL结尾的IP地址数组。
  • 应用场景:网络工具开发、日志分析。
  • 扩展知识:
    • 使用getaddrinfo()替代(支持IPv6)。
    • 异步DNS解析(如c-ares库)。

7. 端口扫描(基础实现)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netdb.h>

#define START_PORT 1

#define END_PORT 1024

#define TIMEOUT 1 // 秒

int isPortOpen(const char *ip, int port) {

int sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock < 0) return 0;

struct sockaddr_in serv_addr;

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(port);

inet_pton(AF_INET, ip, &serv_addr.sin_addr);

// 设置超时

struct timeval tv;

tv.tv_sec = TIMEOUT;

tv.tv_usec = 0;

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

// 尝试连接

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {

close(sock);

return 1;

}

close(sock);

return 0;

}

int main() {

const char *ip = "127.0.0.1";

printf("Scanning ports %d-%d on %s...\n", START_PORT, END_PORT, ip);

for (int port = START_PORT; port <= END_PORT; port++) {

if (isPortOpen(ip, port)) {

printf("Port %d is open\n", port);

}

}

return 0;

}

  • 详细注释:
    • SO_RCVTIMEO:设置连接超时。
    • 扫描范围:1-1024(常见服务端口)。
  • 应用场景:网络安全测试。
  • 注意事项:
    • 未经授权扫描可能违法。
    • 需处理防火墙拦截(如RST包)。

8. 文件传输(TCP Socket)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define PORT 8080

#define BUFFER_SIZE 1024

void sendFile(int sock, const char *filename) {

FILE *file = fopen(filename, "rb");

if (file == NULL) {

perror("Failed to open file");

return;

}

char buffer[BUFFER_SIZE];

size_t bytesRead;

while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) > 0) {

send(sock, buffer, bytesRead, 0);

}

fclose(file);

printf("File sent: %s\n", filename);

}

int main() {

int sock = 0;

struct sockaddr_in serv_addr;

// 创建Socket

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

perror("Socket creation error");

return -1;

}

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(PORT);

inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

// 连接服务器

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {

perror("Connection Failed");

return -1;

}

// 发送文件名

const char *filename = "test.txt";

send(sock, filename, strlen(filename), 0);

// 发送文件内容

sendFile(sock, filename);

close(sock);

return 0;

}

  • 详细注释:
    • 先发送文件名,再传输文件内容。
    • 需服务器端配合接收并保存文件。
  • 扩展知识:
    • 添加校验和(如MD5)验证文件完整性。
    • 分块传输(支持大文件)。

9. 简单聊天室(TCP多客户端)

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <pthread.h>

#define PORT 8080

#define MAX_CLIENTS 10

#define BUFFER_SIZE 1024

int clientSocks[MAX_CLIENTS] = {0};

void broadcastMessage(const char *message, int senderSock) {

for (int i = 0; i < MAX_CLIENTS; i++) {

if (clientSocks[i] != 0 && clientSocks[i] != senderSock) {

send(clientSocks[i], message, strlen(message), 0);

}

}

}

void *handleClient(void *arg) {

int clientSock = *(int *)arg;

char buffer[BUFFER_SIZE] = {0};

int bytesRead;

while ((bytesRead = read(clientSock, buffer, BUFFER_SIZE)) > 0) {

buffer[bytesRead] = '\0';

printf("Client %d: %s", clientSock, buffer);

char response[BUFFER_SIZE + 20];

snprintf(response, sizeof(response), "Client %d: %s", clientSock, buffer);

broadcastMessage(response, clientSock);

}

// 客户端断开

printf("Client %d disconnected\n", clientSock);

close(clientSock);

for (int i = 0; i < MAX_CLIENTS; i++) {

if (clientSocks[i] == clientSock) {

clientSocks[i] = 0;

break;

}

}

return NULL;

}

int main() {

int serverSock, clientSock;

struct sockaddr_in address;

int opt = 1;

int addrlen = sizeof(address);

// 创建Socket

if ((serverSock = socket(AF_INET, SOCK_STREAM, 0)) == 0) {

perror("Socket failed");

exit(EXIT_FAILURE);

}

if (setsockopt(serverSock, 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(PORT);

if (bind(serverSock, (struct sockaddr *)&address, sizeof(address)) < 0) {

perror("Bind failed");

exit(EXIT_FAILURE);

}

if (listen(serverSock, 3) < 0) {

perror("Listen");

exit(EXIT_FAILURE);

}

printf("Chat server started on port %d...\n", PORT);

while (1) {

if ((clientSock = accept(serverSock, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {

perror("Accept");

continue;

}

// 查找空闲槽位

int i;

for (i = 0; i < MAX_CLIENTS; i++) {

if (clientSocks[i] == 0) {

clientSocks[i] = clientSock;

break;

}

}

if (i == MAX_CLIENTS) {

printf("Max clients reached. Rejecting client %d\n", clientSock);

close(clientSock);

continue;

}

printf("New client connected: %d\n", clientSock);

pthread_t tid;

if (pthread_create(&tid, NULL, handleClient, &clientSock) < 0) {

perror("Thread creation failed");

close(clientSock);

continue;

}

pthread_detach(tid);

}

return 0;

}

  • 详细注释:
    • clientSocks数组:管理所有客户端连接。
    • broadcastMessage():向其他客户端广播消息。
  • 应用场景:实时通讯工具。
  • 扩展知识:
    • 添加用户认证(如用户名/密码)。
    • 使用select/poll替代多线程(简化资源管理)。

10. 网络字节序转换

c

#include <stdio.h>

#include <arpa/inet.h>

int main() {

uint32_t hostValue = 0x12345678;

uint32_t netValue = htonl(hostValue); // 主机序转网络序

printf("Host: 0x%08X, Network: 0x%08X\n", hostValue, netValue);

uint32_t backToHost = ntohl(netValue); // 网络序转主机序

printf("Back to host: 0x%08X\n", backToHost);

// 16位整数转换

uint16_t hostShort = 0x1234;

uint16_t netShort = htons(hostShort);

printf("Host short: 0x%04X, Network short: 0x%04X\n", hostShort, netShort);

return 0;

}

  • 详细注释:
    • htonl()/ntohl():32位整数转换。
    • htons()/ntohs():16位整数转换。
  • 应用场景:跨平台网络协议实现。
  • 常见问题:
    • 忽略字节序导致数据解析错误。
    • 浮点数需自定义序列化(如IEEE 754标准)。

扩展知识

  1. 高性能网络编程:
    • 使用epoll(Linux)或kqueue(macOS/BSD)处理高并发。
    • 零拷贝技术(如sendfile)。
  2. 安全建议:
    • 验证输入数据(防止缓冲区溢出)。
    • 使用加密协议(如TLS)。
  3. 协议设计:
    • 自定义二进制协议(如<length><data>格式)。
    • 使用现有协议(如HTTP/2、WebSocket)。

💡注意:本文所介绍的软件及功能均基于公开信息整理,仅供用户参考。在使用任何软件时,请务必遵守相关法律法规及软件使用协议。同时,本文不涉及任何商业推广或引流行为,仅为用户提供一个了解和使用该工具的渠道。

你在生活中时遇到了哪些问题?你是如何解决的?欢迎在评论区分享你的经验和心得!

希望这篇文章能够满足您的需求,如果您有任何修改意见或需要进一步的帮助,请随时告诉我!

感谢各位支持,可以关注我的个人主页,找到你所需要的宝贝。 ​ 
博文入口:https://blog.youkuaiyun.com/Start_mswin ​复制到【浏览器】打开即可,宝贝入口:https://pan.quark.cn/s/71742b5e7629 

作者郑重声明,本文内容为本人原创文章,纯净无利益纠葛,如有不妥之处,请及时联系修改或删除。诚邀各位读者秉持理性态度交流,共筑和谐讨论氛围~

<think>我们正在为"C语言100代码"主题创建10篇独立文章,每篇包含10个代码示例。每个代码示例需要包含: 1.详细注释2.应用场景说明3.运行示例由于这是第一篇,我们先从基础开始。以下是第一篇的10个代码示例,涵盖C语言基础语法和常用操作。 注意:每篇文章代码示例应尽量覆盖不同方面,并且难度逐渐增加。第一篇以基础为主。 ###第一篇:C语言基础语法与常用操作####1. HelloWorld程序```c#include <stdio.h>//包含标准输入输出头文件intmain(){//主函数,程序入口printf("Hello,World!\n");//打印字符串到控制台return0;//返回0,表示程序正常结束} ```**应用场景**:学习任何编程语言的第一个程序,用于验证开发环境配置是否正确。**运行示例**: ```Hello,World!``` ####2.两个整数相加```c#include <stdio.h> intmain(){int a, b, sum;//定义三个整型变量printf("请输入两个整数:");scanf("%d %d",&a, &b);//从用户输入读取两个整数sum =a +b;//计算和printf("它们的和是:%d\n",sum);//输出结果return0; }``` **应用场景**:基本的用户输入和算术运算,用于理解变量和输入输出操作。 **运行示例**:``` 请输入两个整数:53它们的和是:8```####3.判断奇偶数```c#include <stdio.h> intmain(){int num;printf("请输入一个整数:");scanf("%d",&num);//使用模运算判断奇偶if(num%2 ==0){printf("%d是偶数。\n",num);}else {printf("%d是奇数。\n", num);}return0;} ```**应用场景**:条件语句和模运算的基本应用,常用于简单逻辑判断。**运行示例**: ```请输入一个整数:77是奇数。 ```####4.计算阶乘```c#include<stdio.h>int main() {intn,i;unsignedlong longfactorial=1;//使用无符号长整型以防结果过大printf("请输入一个正整数:");scanf("%d", &n);//阶乘计算for (i =1; i<= n; ++i){factorial *=i;//累乘}printf("%d的阶乘= %llu\n",n,factorial);return0; }``` **应用场景**:循环结构的基本应用,用于计算阶乘等数学问题。 **运行示例**:``` 请输入一个正整数:55的阶乘=120``` ####5.检查素数```c#include <stdio.h> #include<math.h>//引入数学库以使用sqrt函数int main() {intn,i,flag =1;// flag为1表示素数,0表示非素数printf("请输入一个正整数:");scanf("%d", &n);//素数判断:从2到sqrt(n)进行整除测试for (i =2; i<= sqrt(n);i++){if (n %i ==0) {flag=0;//如果被整除,则不是素数break;}}if(n<=1)flag =0; //1和负数不是素数if (flag){printf("%d是素数。\n", n);} else{printf("%d不是素数。\n",n);}return0; }``` **应用场景**:循环和条件语句结合,用于判断一个数是否为素数,是算法基础。**运行示例**: ```请输入一个正整数:2929是素数。 ```####6.斐波那契数列```c#include <stdio.h> intmain(){int i, n;longlong t1 =0, t2 =1, nextTerm;//初始化前两项printf("请输入项数:");scanf("%d",&n);printf("斐波那契数列:");for (i =1; i<= n; ++i){printf("%lld ",t1);//输出当前项nextTerm= t1 +t2;//计算下一项t1 =t2;//更新第一项t2 =nextTerm;//更新第二项}return0; }``` **应用场景**:循环和递推关系的基本应用,生成斐波那契数列。**运行示例**: ```请输入项数:7斐波那契数列:0112358``` ####7.交换两个变量的值```c#include <stdio.h> intmain(){int a, b, temp;printf("请输入两个整数:");scanf("%d %d",&a, &b);//交换变量temp= a;a =b;b= temp;printf("交换后:a= %d,b =%d\n",a,b);return0; }``` **应用场景**:变量交换是许多算法中的基本操作,如排序算法。**运行示例**: ```请输入两个整数:1020交换后:a=20,b =10```####8.求两个整数的最大公约数(GCD) ```c#include <stdio.h> intmain(){int n1,n2,gcd;printf("请输入两个正整数:");scanf("%d%d", &n1, &n2);//使用辗转相除法(欧几里得算法)while (n1!= n2){if (n1> n2){n1-= n2;}else {n2 -=n1;}}gcd =n1; //当n1等于n2时,即为最大公约数printf("最大公约数:%d\n",gcd);return0; }``` **应用场景**:数学问题中常见,用于简化分数等。 **运行示例**:``` 请输入两个正整数:81153最大公约数:9```####9.数组求和```c#include<stdio.h>int main() {intarray[10]= {1,2,3,4,5,6,7,8,9,10}; //初始化数组intsum =0, i;//遍历数组求和for(i=0;i <10; i++) {sum+= array[i];}printf("数组元素之和:%d\n", sum);return0;} ```**应用场景**:数组基本操作,用于数据统计。 **运行示例**:``` 数组元素之和:55```####10.冒泡排序```c#include <stdio.h> intmain(){int array[]= {64,34,25,12,22,11,90};//待排序数组intn =sizeof(array) /sizeof(array[0]);//计算数组长度int i, j, temp;//冒泡排序算法for (i =0;i <n-1;i++){for (j =0;j <n-i-1; j++) {if(array[j]> array[j+1]){//交换相邻元素temp= array[j];array[j]= array[j+1];array[j+1]= temp;}}}//输出排序后的数组printf("排序后的数组:");for (i =0;i <n;i++){printf("%d ",array[i]);}return0;} ```**应用场景**:排序算法基础,用于小规模数据排序。 **运行示例**:``` 排序后的数组:11122225346490```以上是第一篇文章的10个代码示例。接下来我们将创建第二篇,主题可以是指针和数组的深入应用。</think>### C语言代码:基础篇(10个核心示例) #### 1. Hello World程序 ```c #include <stdio.h> // 包含标准输入输出头文件 int main() { // 程序入口函数 printf("Hello, World!\n"); // 输出文本到控制台 return 0; // 程序正常退出 } ``` **应用场景**:编程语言学习入门,验证开发环境配置 **运行结果**: ``` Hello, World! ``` #### 2. 整数四则运算 ```c #include <stdio.h> int main() { int a = 15, b = 4; // 声明并初始化变量 printf("加法: %d\n", a + b); // 加法运算 printf("减法: %d\n", a - b); // 减法运算 printf("乘法: %d\n", a * b); // 乘法运算 printf("除法: %d\n", a / b); // 整数除法 printf("取模: %d\n", a % b); // 取余运算 return 0; } ``` **应用场景**:基础算术运算,计算器程序核心 **运行结果**: ``` 加法: 19 减法: 11 乘法: 60 除法: 3 取模: 3 ``` #### 3. 条件判断(成绩分级) ```c #include <stdio.h> int main() { int score = 85; if(score >= 90) { printf("A\n"); } else if(score >= 80) { printf("B\n"); // 执行此分支 } else if(score >= 70) { printf("C\n"); } else { printf("D\n"); } return 0; } ``` **应用场景**:成绩评估系统,条件分支处理 **运行结果**: ``` B ``` #### 4. 循环求和(1-100) ```c #include <stdio.h> int main() { int sum = 0; for(int i = 1; i <= 100; i++) { // for循环结构 sum += i; // 累加求和 } printf("1-100的和: %d\n", sum); return 0; } ``` **应用场景**:数据统计,批量计算 **运行结果**: ``` 1-100的和: 5050 ``` #### 5. 数组遍历 ```c #include <stdio.h> int main() { int nums[5] = {10, 20, 30, 40, 50}; // 声明并初始化数组 for(int i = 0; i < 5; i++) { printf("元素%d: %d\n", i, nums[i]); // 访问数组元素 } return 0; } ``` **应用场景**:数据处理,传感器读数存储 **运行结果**: ``` 元素0: 10 元素1: 20 元素2: 30 元素3: 40 元素4: 50 ``` #### 6. 函数定义与调用 ```c #include <stdio.h> // 函数声明 int max(int a, int b); int main() { int x = 25, y = 37; printf("较大值: %d\n", max(x, y)); // 函数调用 return 0; } // 函数定义 int max(int a, int b) { return (a > b) ? a : b; // 三元运算符 } ``` **应用场景**:模块化编程,代码复用 **运行结果**: ``` 较大值: 37 ``` #### 7. 指针基础 ```c #include <stdio.h> int main() { int var = 50; int *ptr = &var; // 指针指向变量地址 printf("变量值: %d\n", var); printf("指针值: %p\n", (void*)ptr); // 打印地址 printf("通过指针访问: %d\n", *ptr); // 解引用 *ptr = 100; // 通过指针修改变量 printf("修改后值: %d\n", var); return 0; } ``` **应用场景**:内存操作,高效数据传递 **运行结果**: ``` 变量值: 50 指针值: 0x7ffd4a3b5a9c (示例地址) 通过指针访问: 50 修改后值: 100 ``` #### 8. 结构体使用 ```c #include <stdio.h> #include <string.h> // 定义结构体类型 struct Student { char name[50]; int age; float gpa; }; int main() { // 声明结构体变量 struct Student stu1; // 结构体成员赋值 strcpy(stu1.name, "张三"); stu1.age = 20; stu1.gpa = 3.75f; printf("姓名: %s\n年龄: %d\nGPA: %.2f\n", stu1.name, stu1.age, stu1.gpa); return 0; } ``` **应用场景**:数据记录管理,复杂数据结构 **运行结果**: ``` 姓名: 张三 年龄: 20 GPA: 3.75 ``` #### 9. 文件读写 ```c #include <stdio.h> int main() { FILE *f = fopen("data.txt", "w"); // 打开文件(写模式) if(f == NULL) { // 文件打开检查 printf("文件打开失败\n"); return 1; } fprintf(f, "C语言文件操作示例\n"); // 写入文件 fclose(f); // 关闭文件 // 读取文件 f = fopen("data.txt", "r"); char buffer[100]; fgets(buffer, 100, f); // 读取一行 printf("文件内容: %s", buffer); fclose(f); return 0; } ``` **应用场景**:数据持久化,日志记录 **运行结果**: ``` 文件内容: C语言文件操作示例 ``` #### 10. 动态内存分配 ```c #include <stdio.h> #include <stdlib.h> // 包含malloc/free函数 int main() { int *arr; int size = 5; // 动态分配内存 arr = (int*)malloc(size * sizeof(int)); if(arr == NULL) { // 内存分配检查 printf("内存分配失败\n"); return 1; } // 初始化数组 for(int i = 0; i < size; i++) { arr[i] = i * 10; } // 打印数组 for(int i = 0; i < size; i++) { printf("%d ", arr[i]); } free(arr); // 释放内存 return 0; } ``` **应用场景**:灵活内存管理,大数据处理 **运行结果**: ``` 0 10 20 30 40 ``` ### 相关问题 1. 如何理解C语言中的指针和内存地址关系? 2. 结构体和数组在存储数据时有哪些本质区别? 3. 动态内存分配时为什么须检查返回值? 4. 文件操作中不同模式(r/w/a)有何具体区别? 5. 在循环结构中使用`break`和`continue`有什么注意事项?[^1] [^1]: 静态变量和全局变量在C语言中的初始化发生在编译期,早于任何代码执行。这与C++的首次使用初始化机制不同。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山峰哥

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值