START
hello,大家好!我是木荣君。最近比较火的ChatGPT着实令人眼前一亮。先来说一说ChatGPT是什么?ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI研发的聊天机器人程序,于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论文等任务。看到这儿,ChatGPT功能着实强大,好多人都想体验一把,但是国内注册ChatGPT账号非常的繁琐和麻烦,今天给大家推荐一个类似ChatGPT的插件,而且是在VSCode的中插件,木荣君本人体验了一把,感觉也很丝滑。关键是可以集成到VSCode当中,这让我对VSCode的爱又多了一点!
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
struct Node {
int data;
struct Node* next;
};
// 初始化链表头结点
struct Node* head = NULL;
// 插入元素到链表尾部
void insert(int data) {
// 分配新节点内存空间
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
// 设置新节点数据
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
// 如果链表为空,则将新节点作为头结点
head = newNode;
} else {
// 否则将新节点插入到链表末尾
struct Node* tempNode = head;
while (tempNode->next != NULL) {
tempNode = tempNode->next;
}
tempNode->next = newNode;
}
}
// 删除指定元素
void delete(int data) {
if (head == NULL) {
printf("链表为空,无法删除!\n");
return;
}
if (head->data == data) {
// 如果要删除头结点,则直接将下一个节点作为新的头结点
struct Node* tempNode = head;
head = head->next;
free(tempNode);
return;
}
// 搜索要删除的节点
struct Node* tempNode = head;
while (tempNode->next != NULL && tempNode->next->data != data) {
tempNode = tempNode->next;
}
if (tempNode->next == NULL) {
// 没有找到要删除的节点
printf("要删除的元素不存在!\n");
return;
}
// 将下一个节点连接到要删除的节点的下一个节点
struct Node* delNode = tempNode->next;
tempNode->next = delNode->next;
free(delNode);
}
// 打印链表元素
void printList() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
struct Node* tempNode = head;
printf("链表元素: ");
while (tempNode != NULL) {
printf("%d ", tempNode->data);
tempNode = tempNode->next;
}
printf("\n");
}
int main() {
// 在链表尾部插入元素
insert(1);
insert(2);
insert(3);
insert(4);
insert(5);
printList(); // 预期输出:链表元素:1 2 3 4 5
// 删除元素
delete(3);
delete(6); // 不存在的元素
printList(); // 预期输出:链表元素:1 2 4 5
return 0;
}
以下是一个使用 C 语言实现的基本 TCP 服务器的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 8080
int main() {
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char* hello = "Hello from server";
// 创建 TCP 套接字
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(PORT);
// 绑定地址和端口
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);
}
while (true) {
// 接受新连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 读取客户端发送的数据
valread = read(new_socket, buffer, 1024);
printf("%s\n",buffer );
// 向客户端发送欢迎消息
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
close(new_socket); // 关闭连接
}
return 0;
}
在这个示例中,我们首先创建了一个 TCP 套接字,并将其绑定到指定的 IP 地址和端口上。接着,我们通过调用 `listen()` 函数开始监听新连接。当有新的客户端连接时,我们使用 `accept()` 函数接受连接,并读取客户端发送的数据。最后,我们向客户端发送欢迎消息,并关闭连接。
这是一个简单的 TCP 服务器示例,可以根据需要进行修改和扩展,例如使用多线程或 epoll 等技术来实现高并发处理。
好了,有兴趣的小伙伴可以试着安装一下。个人觉得,娱乐一下还可以,仅作参考不可尽信哦!