为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

浪潮君 的学生作业:

#include #include #include class String { private: char *data_; // 指向动态分配的字符数组,存储字符串内容 size_t size_; // 字符串长度,不包含结尾的 '\0' public: // 构造函数:根据传入的 C 字符串初始化对象 explicit String(const char *str) { if (str == NULL) { // 如果传入空指针,初始化为空字符串 size_ = 0; data_ = new char[1]; data_[0] = '\0'; // 以空字符结束 } else { // 计算字符串长度 size_ = std::strlen(str); // 分配内存空间,包含结尾空字符 data_ = new char[size_ + 1]; // 复制字符串内容 std::strcpy(data_, str); } } // 析构函数:释放动态分配的内存 ~String() { delete[] data_; } // 拷贝构造函数:实现深拷贝 String(const String &other) { size_ = other.size_; data_ = new char[size_ + 1]; std::strcpy(data_, other.data_); } // 赋值运算符重载:实现深拷贝,防止自赋值 String &operator=(const String &other) { if (this != &other) { delete[] data_; // 释放原有内存 size_ = other.size_; data_ = new char[size_ + 1]; std::strcpy(data_, other.data_); } return *this; } // 返回字符串长度 size_t size() const { return size_; } // 下标运算符重载(非 const 版本):允许修改字符 char &operator[](size_t index) { if (index >= size_) { // 越界访问,抛出标准异常 throw std::out_of_range("index out of range"); } return data_[index]; } // 下标运算符重载(const 版本):只读访问字符 const char &operator[](size_t index) const { if (index >= size_) { // 越界访问,抛出标准异常 throw std::out_of_range("index out of range"); } return data_[index]; } // 返回底层 C 风格字符串指针,方便与标准库兼容 const char *c_str() const { return data_; } }; // 全局输出流运算符重载:实现直接输出 String 对象 std::ostream &operator

得分 100
学习任务

浪潮君 的学生作业:

#include #include #include // 自定义 String 类,模拟 std::string 的基本行为 class String { private: char *data_; // 指向字符串数据的动态分配内存 size_t size_; // 字符串长度,不包括结尾符 '\0' public: // 显式构造函数:从 C 字符串初始化 String 对象 explicit String(const char *str) { if (str == NULL) { // 空指针处理,创建一个空字符串 size_ = 0; data_ = new char[1]; data_[0] = '\0'; } else { // 正常字符串,计算长度并复制内容 size_ = std::strlen(str); data_ = new char[size_ + 1]; // 多分配 1 个字节用于 '\0' std::strcpy(data_, str); // 拷贝字符串内容 } } // 析构函数:释放动态分配的内存,防止内存泄漏 ~String() { delete[] data_; } // 拷贝构造函数:深拷贝另一个 String 对象 String(const String &other) { size_ = other.size_; // 拷贝长度 data_ = new char[size_ + 1]; // 分配新内存 std::strcpy(data_, other.data_); // 拷贝字符串内容 } // 拷贝赋值运算符:避免自我赋值,释放旧内存后深拷贝 String &operator=(const String &other) { if (this != &other) { delete[] data_; // 释放旧内存 size_ = other.size_; // 拷贝长度 data_ = new char[size_ + 1]; // 分配新内存 std::strcpy(data_, other.data_); // 拷贝内容 } return *this; // 返回自身引用以支持链式赋值 } // 获取字符串长度(不含 '\0') size_t size() const { return size_; } // 下标运算符重载:非 const 版本,返回字符引用,可修改内容 char &operator[](size_t index) { if (index >= size_) { throw std::out_of_range("Index out of range"); } return data_[index]; } // 下标运算符重载:const 版本,返回只读字符引用 const char &operator[](size_t index) const { if (index >= size_) { throw std::out_of_range("Index out of range"); } return data_[index]; } }; // 主函数:测试自定义 String 类的基本功能 int main() { String str("hello"); // 创建字符串对象 str,内容为 "hello" str[0] = 'w'; // 修改第 0 个字符为 'w' str[1] = 'x'; // 修改第 1 个字符为 'x' // 逐字符打印修改后的字符串内容 for (size_t i = 0; i < str.size(); ++i) { std::cout

得分 100
学习任务

北城半夏4806197 的学生作业:

serve.c #include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 typedef struct { char *ip; unsigned char flag; struct sockaddr_in *peer_addr; }thread_type; void printf_client_info(struct sockaddr_in *addr,char *buf) { printf("===============================\n"); printf("user IP : %s\n",inet_ntoa(addr->sin_addr)); printf("user port : %d\n", ntohs(addr->sin_port)); printf("user data : %s\n",buf); } //1.初始化socket连接 int init_socket(const char *ip,const char *port) { int sockfd = 0; struct sockaddr_in my_addr; socklen_t len = sizeof(my_addr); //1.通过socket创建文件描述符 sockfd = socket(AF_INET,SOCK_DGRAM ,0); if(sockfd < 0) { perror("Fail to socket!"); exit(EXIT_FAILURE); } //2.填充服务器自己的ip地址和port,然后绑定 memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(atoi(port)); my_addr.sin_addr.s_addr = inet_addr(ip); if(bind(sockfd,(struct sockaddr *)&my_addr,len) < 0) { perror("Fail to bind"); return -1; } return sockfd; } void recv_data(int new_sockfd) { int n = 0; char buf[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); //3.发送数据 while(1) { memset(buf,0,sizeof(buf)); n = recvfrom(new_sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(n < 0) { perror("Fail to recvfrom"); exit(EXIT_FAILURE); } printf_client_info(&client_addr,buf); if(strncmp(buf,"quit",4) == 0) break; } close(new_sockfd); return ; } void *message_thread(void *arg) { thread_type *packet = (thread_type *)arg; char *ip = packet->ip; unsigned char login_flag = packet->flag; struct sockaddr_in *addr = packet->peer_addr; //创建套接字,获得用户数据,绑定0号端口,系统会随机分配一个可用的端口 int new_sockfd = init_socket(ip,"0"); sendto(new_sockfd,&login_flag,sizeof(login_flag),0,(struct sockaddr *)addr,sizeof(struct sockaddr_in)); recv_data(new_sockfd); pthread_exit(NULL); } void user_login(const char *ip,const char *port) { int n = 0; char buf[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); unsigned char login_flag; int sockfd; thread_type packet; pthread_t tid; //1.创建套接字,获得用户数据 sockfd = init_socket(ip,port); //2.接收登录数据 while(1) { memset(buf,0,sizeof(buf)); n = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(n < 0) { perror("Fail to recvfrom"); exit(EXIT_FAILURE); } printf("key = %s\n",buf); login_flag = (strncmp(buf,"root",4) == 0) ? LOGIN_SUCCESS : LOGIN_FAILURE; //说明此时秘钥正确 if(login_flag == LOGIN_SUCCESS) { packet.ip = (char *)ip; packet.flag = login_flag; packet.peer_addr = &client_addr; //创建子线程,子线程准备接收当前用户数据,主线程接续接收新用户的秘钥 pthread_create(&tid,NULL,message_thread,(void *)&packet); }else{ //秘钥不正确,使用原始端口回复信息 sendto(sockfd,&login_flag,sizeof(login_flag),0,(struct sockaddr *)&client_addr,len); } //把线程设置为分离式 pthread_detach(tid); } return ; } //./a.out ip port int main(int argc, const char *argv[]) { int sockfd; unsigned char login_flag; if(argc < 3) { fprintf(stderr,"Usage : %s ip port!\n",argv[0]); exit(EXIT_FAILURE); } //1.接收用户的秘钥,准备登录 user_login(argv[1],argv[2]); return 0; } client #include #include #include #include #include /* See NOTES */ #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 void user_login(int sockfd,struct sockaddr_in *addr,struct sockaddr_in *new_addr,int len) { int n = 0; char buf[1024] = {0}; unsigned char flag = LOGIN_FAILURE; //发送数据 while(1) { putchar('>'); memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); buf[strlen(buf) - 1] = '\0'; //'\n'-->'\0' n = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)addr,len); if(n < 0) { perror("Fail to sendto"); exit(EXIT_FAILURE); } recvfrom(sockfd,&flag,sizeof(flag),0,(struct sockaddr *)new_addr,&len); //说明登录成功,否则继续登录 if(flag == LOGIN_SUCCESS) break; } return ; } void send_message(int sockfd,struct sockaddr_in *addr,int addr_len) { int n = 0; char buf[1024] = {0}; //发送数据 while(1) { printf("Input : "); memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); buf[strlen(buf) - 1] = '\0'; //'\n'-->'\0' n = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)addr,addr_len); if(n < 0) { perror("Fail to sendto"); exit(EXIT_FAILURE); } if(strncmp(buf,"quit",4) == 0) break; } return ; } //./a.out ip port int main(int argc, const char *argv[]) { int sockfd = 0; struct sockaddr_in peer_addr; struct sockaddr_in server_addr; socklen_t len = sizeof(peer_addr); if(argc < 3) { fprintf(stderr,"Usage : %s ip port!\n",argv[0]); exit(EXIT_FAILURE); } //1.通过socket创建文件描述符 sockfd = socket(AF_INET,SOCK_DGRAM ,0); if(sockfd < 0) { perror("Fail to socket!"); exit(EXIT_FAILURE); } //2.填充服务器的ip地址和port,方便绑定 memset(&peer_addr,0,sizeof(peer_addr)); peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(atoi(argv[2])); peer_addr.sin_addr.s_addr = inet_addr(argv[1]); //3.发送登录数据 memset(&server_addr,0,sizeof(server_addr)); user_login(sockfd,&peer_addr,&server_addr,len); //4.发送交互数据 send_message(sockfd,&server_addr,len); //5.关闭文件描述符 close(sockfd); return 0; } 【图片】 【图片】

得分 100
学习任务

史啦啦 的学生作业:

【图片】 #include #include #include #include #include #include #include #define MAXEVENTS 10 #define FIFO_PATH "./fifo_epoll_ctl" int main(void) { int epfd,ret,fifo_fd; struct epoll_event ev; struct epoll_event ret_ev[MAXEVENTS]; char buffer[1024] = {0}; //创建有名管道 if(mkfifo(FIFO_PATH,0666) == -1 && errno != EEXIST) { perror("[ERROR] mkfifo(): "); exit(EXIT_FAILURE); } //以非阻塞模式打开管道 fifo_fd = open(FIFO_PATH,O_RDONLY | O_NONBLOCK); if(fifo_fd == -1) { perror("[ERROR] open(): "); exit(EXIT_FAILURE); } //创建epoll实例 epfd = epoll_create(1); if(epfd == -1) { perror("[ERROR] epoll_create(): "); close(fifo_fd); exit(EXIT_FAILURE); } //将管道文件描述符添加到epoll监听 ev.events = EPOLLIN |EPOLLHUP; //监听可读和挂起事件 ev.data.fd = fifo_fd; if(epoll_ctl(epfd,EPOLL_CTL_ADD,fifo_fd,&ev) == -1) { perror("[ERROR] epoll_ctl(): "); close(fifo_fd); close(epfd); exit(EXIT_FAILURE); } printf("Listening FIFO: %s\n",FIFO_PATH); while(1) { ret = epoll_wait(epfd,ret_ev,MAXEVENTS,1000); //1秒超时 if(ret == -1) { perror("[ERROR] epoll_wait(): "); break; } else if(ret == 0) { printf("Timeout.\n"); continue; } for(int i=0;i 0) { buffer[bytes_read] = '\0'; printf("Received: %s\n",buffer); } else if(bytes_read == -1 && errno != EAGAIN) { perror("[ERROR] read(): "); } } } } } close(fifo_fd); close(epfd); return 0; }

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号