Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例
Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例
- 第18章-Qt MyselfQQ
- 18.1 概述
- 18.2 、发送文件
- 18.3 、接收文件
- 18.4 、保证传输的安全和稳定
- 18.5 、总结
- 本章相关例程源码下载
- 1.Qt5开发及实例_CH1801.rar 下载
第18章-Qt MyselfQQ
18.1 概述
MyselfQQ是一个基于Qt5框架开发的轻量级即时通讯软件,支持文本、图片、语音、文件等多种消息类型的发送和接收。其中,文件传输是MyselfQQ的一个核心功能,可以实现高效、稳定、安全的文件传输。
本文将介绍MyselfQQ的文件传输功能,包括如何发送和接收文件,以及如何保证传输的安全性和稳定性。同时,本文会提供相关的代码示例,以方便开发者进行参考和实践。
18.2 、发送文件
1.1 选择文件
要发送文件,需要先选择要发送的文件。在MyselfQQ中,可以通过打开本地文件夹或者拖拽文件到发送窗口来选择要发送的文件。
打开本地文件夹的方法比较简单,只需要在主界面点击“文件”菜单,选择“打开文件夹”,然后在弹出的文件选择框中选择要发送的文件即可。
如果要通过拖拽文件来选择要发送的文件,可以在主界面直接拖拽文件到发送窗口,或者在本地文件夹中选择要发送的文件,然后拖拽到发送窗口即可。
1.2 发送文件
选择好要发送的文件后,就可以将文件发送给对方了。在MyselfQQ中,发送文件的逻辑可以分为以下几个步骤:
- 创建文件传输对象
在发送文件之前,需要先创建文件传输对象。文件传输对象包含了发送方和接收方的相关信息,以及要发送的文件的路径、大小等信息。
文件传输对象的定义如下:
struct FileTransferObject
{QString fileName; // 文件名QString filePath; // 文件路径qint64 fileSize; // 文件大小QString senderName; // 发送方用户名QString receiverName; // 接收方用户名QString ip; // 接收方IP地址qint16 port; // 接收方端口号bool isAccepted; // 是否被接收bool isSending; // 是否正在发送bool isFinished; // 是否发送完成qint64 sentSize; // 已发送大小QTcpSocket* socket; // 用于发送数据的TCP连接
};
其中,senderName和receiverName分别表示发送方和接收方的用户名;ip和port表示接收方的IP地址和端口号;isAccepted、isSending和isFinished分别表示文件是否被接收、是否正在发送、是否发送完成;sentSize表示已发送的文件大小;socket表示用于发送数据的TCP连接。
- 获取接收方IP地址和端口号
在创建文件传输对象之后,需要获取接收方的IP地址和端口号。这里使用UDP广播来实现,即发送一个UDP广播,让接收方返回自己的IP地址和端口号。
发送UDP广播的代码如下:
void MainWindow::broadcast()
{QByteArray datagram = "hello";QHostAddress broadcastAddress = QHostAddress::Broadcast;quint16 port = 6666;udpSocket->writeDatagram(datagram, broadcastAddress, port);
}
在发送UDP广播之后,需要监听接收方返回的IP地址和端口号。当接收到回复消息时,就可以获取到接收方的IP地址和端口号了。
void MainWindow::processPendingDatagrams()
{while (udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);// 处理接收到的UDP数据包}
}
处理接收到的UDP数据包的具体代码如下:
void MainWindow::processBroadcastDatagram(const QByteArray& datagram, const QHostAddress& sender, quint16 senderPort)
{if (datagram == "hello"){QByteArray response = QString("%1,%2").arg(QHostInfo::localHostName()).arg(tcpServer->serverPort()).toUtf8();udpSocket->writeDatagram(response, sender, senderPort);}else if (datagram.startsWith("IP:")){QString receiverName = datagram.mid(3);QString ip = sender.toString();quint16 port = senderPort;FileTransferObject* obj = findFileTransferObject(receiverName);if (obj != nullptr){obj->ip = ip;obj->port = port;// 开始发送文件startSendFile(obj);}}
}
在处理接收到的UDP数据包时,如果收到的是“hello”消息,就会回复一个包含本机主机名和TCP监听端口号的消息。如果收到的是“IP:xxx”消息,就会获取到接收方的IP地址和端口号,并开始发送文件。
- 开始发送文件
在获取到接收方的IP地址和端口号后,就可以开始发送文件了。文件的发送采用TCP连接来进行,因为TCP连接可以保证传输的稳定性和安全性。
发送文件的关键代码如下:
void MainWindow::startSendFile(FileTransferObject* obj)
{QTcpSocket* socket = new QTcpSocket(this);obj->socket = socket;connect(socket, SIGNAL(connected()), this, SLOT(onSendConnected()));connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSendError(QAbstractSocket::SocketError)));socket->connectToHost(obj->ip, obj->port);obj->isSending = true;obj->isAccepted = true;obj->sentSize = 0;obj->isFinished = false;
}void MainWindow::onSendConnected()
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if (socket != nullptr){FileTransferObject* obj = findFileTransferObject(socket);if (obj != nullptr){QFile file(obj->filePath);if (file.open(QIODevice::ReadOnly)){QByteArray block;QDataStream out(&block, QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_9);out << qint64(0) << qint64(0) << obj->fileName;qint64 fileSize = file.size();out << fileSize;socket->write(block);obj->isAccepted = true;obj->fileSize = fileSize;}else{socket->close();}}}
}void MainWindow::onBytesWritten(qint64 bytes)
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if (socket != nullptr){FileTransferObject* obj = findFileTransferObject(socket);if (obj != nullptr){obj->sentSize += bytes;if (obj->sentSize == obj->fileSize){obj->isFinished = true;socket->close();}else{// 继续发送剩余的数据}}}
}void MainWindow::onSendError(QAbstractSocket::SocketError error)
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if (socket != nullptr){FileTransferObject* obj = findFileTransferObject(socket);if (obj != nullptr){obj->isSending = false;obj->isAccepted = false;emit sendFileError(obj->fileName, obj->senderName, obj->receiverName, socket->errorString());// 关闭socket}}
}
在开始发送文件时,会创建一个QTcpSocket对象,然后连接到接收方的IP地址和端口号。当连接成功后,会发送一个包含文件名和文件大小的消息,让接收方做好接收文件的准备。接着,会按照一定的数据块大小,将文件分块发送到接收方。每发送一个数据块,都会记录已发送的文件大小,以便在下次发送时从上次发送的位置开始继续发送。
在发送文件的过程中,需要不断地检测已发送的文件大小是否等于文件总大小,以判断是否已经发送完毕。如果已经发送完毕,就会将isFinished设置为true,然后关闭TCP连接。如果出现发送错误,就会设置isSending为false,将isAccepted设置为false,并关闭TCP连接。
18.3 、接收文件
当MyselfQQ接收到文件传输请求时,会弹出一个文件传输接收窗口,用户可以选择接收或拒绝文件传输。
文件传输接收窗口的代码如下:
void MainWindow::showFileTransferDialog(FileTransferObject* obj)
{FileTransferDialog* dialog = new FileTransferDialog(obj, this);connect(dialog, SIGNAL(accepted(FileTransferObject*)), this, SLOT(onFileTransferAccepted(FileTransferObject*)));connect(dialog, SIGNAL(rejected(FileTransferObject*)), this, SLOT(onFileTransferRejected(FileTransferObject*)));dialog->show();
}
如果用户选择接收文件,就会开始接收文件。接收文件的过程采用TCP连接来完成,与发送文件的过程类似。
接收文件的关键代码如下:
void MainWindow::startReceiveFile(FileTransferObject* obj)
{QTcpSocket* socket = new QTcpSocket(this);obj->socket = socket;connect(socket, SIGNAL(connected()), this, SLOT(onReceiveConnected()));connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onReceiveError(QAbstractSocket::SocketError)));socket->connectToHost(obj->senderIp, obj->senderPort);obj->isSending = false;obj->isAccepted = true;obj->isFinished = false;
}void MainWindow::onReceiveConnected()
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if (socket != nullptr){FileTransferObject* obj = findFileTransferObject(socket);if (obj != nullptr){QByteArray block;QDataStream in(&block, QIODevice::ReadOnly);in.setVersion(QDataStream::Qt_5_9);qint64 blockSize = qint64(0);qint64 fileSize = qint64(0);QString fileName;socket->bytesAvailable();while (socket->bytesAvailable() < sizeof(qint64) * 2 + sizeof(QString)){if (!socket->waitForReadyRead(30000)){socket->close();return;}}in >> blockSize;in >> fileSize;in >> fileName;obj->isAccepted = true;obj->fileSize = fileSize;obj->fileName = fileName;obj->sentSize = 0;}}
}void MainWindow::onReadyRead()
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if (socket != nullptr){FileTransferObject* obj = findFileTransferObject(socket);if (obj != nullptr){if (obj->isFinished){return;}if (obj->sentSize == 0){obj->file = new QFile(obj->filePath);if (!obj->file->open(QIODevice::WriteOnly)){socket->close();return;}}qint64 bytesCount = qint64(0);QByteArray buffer;while (socket->bytesAvailable() > 0){buffer = socket->read(qMin(socket->bytesAvailable(), qint64(1024)));bytesCount += obj->file->write(buffer);obj->sentSize += bytesCount;}if (obj->sentSize == obj->fileSize){obj->isFinished = true;obj->file->close();socket->close();emit receiveFileFinished(obj->fileName, obj->senderName, obj->receiverName);}}}
}void MainWindow::onReceiveError(QAbstractSocket::SocketError error)
{QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());if (socket != nullptr){FileTransferObject* obj = findFileTransferObject(socket);if (obj != nullptr){obj->isSending = false;obj->isAccepted = false;emit receiveFileError(obj->fileName, obj->senderName, obj->receiverName, socket->errorString());// 关闭socket}}
}
当接收方与发送方建立TCP连接后,接收方会等待发送方发送一个消息,其中包含了文件名和文件大小。接收方会先读取这个消息,然后创建一个与文件名相同的文件,并开始接收发送方发送的数据。每接收一段数据,就会将其写入文件,并记录已接收的文件大小。当已接收的文件大小等于文件总大小时,就认为文件已经接收完成。
18.4 、保证传输的安全和稳定
在MyselfQQ中,为了保证文件传输的安全和稳定,采取了以下几个措施:
-
采用TCP连接传输文件,以保证传输的稳定性和安全性。
-
对文件进行分块传输,每个数据块的大小为1024字节,以减小传输过程中出现中断的风险。
-
在发送文件时,会记录已发送的文件大小,以便在下次发送时从上次发送的位置开始继续发送。
-
在接收文件时,会记录已接收的文件大小,以便在下次接收时从上次接收的位置开始继续接收。
-
在发送文件和接收文件时,会对TCP连接的错误进行处理,以保证传输的可靠性和稳定性。
18.5 、总结
MyselfQQ的文件传输功能采用TCP连接来实现,支持多种类型的文件传输,如文本、图片、语音和文件等。在文件传输过程中,采取了多种措施来保证传输的安全性和稳定性。开发者可以根据本文提供的代码示例学习和实践,以在自己的应用中实现类似的文件传输功能。
本章相关例程源码下载
1.Qt5开发及实例_CH1801.rar 下载
Qt5开发及实例_CH1801.rar
相关文章:
![](https://img-blog.csdnimg.cn/1593e56219cd44d585f974e225d2c5d3.png)
Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例
Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例 第18章-Qt MyselfQQ18.1 概述18.2 、发送文件18.3 、接收文件18.4 、保证传输的安全和稳定18.5 、总结 本章相关例程源码下载1.Qt5开发及实例_CH1801.rar 下载 第18章-Qt MyselfQQ 18.1 概述 MyselfQQ是一个基于Qt5框架开发的轻量…...
![](https://img-blog.csdnimg.cn/0905588c18d44bb1aae236c4278ecd79.png)
当下IT测试技术员的求职困境
从去年被裁到现在,自由职业的我已经有一年没有按部就班打卡上班了。期间也面试了一些岗位,有首轮就挂的,也有顺利到谈薪阶段最后拿了offer的,不过最后选择了拒绝。 基于自己近一年的面试求职经历,我想聊聊当下大家在求…...
![](https://www.ngui.cc/images/no-images.jpg)
MR混合现实情景实训教学
MR混合现实技术是一种将虚拟现实与现实场景相融合的创新技术,可以广泛应用于各个领域。其中,混合现实情景实训教学是MR技术的一个重要应用场景。 在医学专业方面,医学生常常需要通过实际操作来提升自己的技能水平,然而传统的实训方…...
![](https://www.ngui.cc/images/no-images.jpg)
嵌入式C++总结
1、new delete与malloc free区别 new delete是运算符,malloc free是函数。 前者不需要传入大小,后者需要。 前者会调用构造、析构函数,后者不会。 前者不需要强制转换,后者需要。 2、智能指针 智能指针是避免忘记释放动态申请对象…...
![](https://img-blog.csdnimg.cn/221dc9dd3a3b4f028a25c0ac3d3d346b.png)
C语言之内存函数篇(3)
目录 memcpy memcpy的使用 memcpy的模拟实现 NO1. NO2. memcpy可否实现重叠空间的拷贝 my_memcpy memcpy memmove memmove memmove 分析 代码 memset memset的使用 memcmp memcmp的使用 <0 0 >0 今天我们继续介绍几个重要的内存操作函数。&…...
![](https://img-blog.csdnimg.cn/img_convert/9173914d1f4dc008c6448fe9427c6c46.png)
java面试题-学成在线项目
1、详细说说你的项目吧 从以下几个方面进行项目介绍: 1、项目的背景,包括:是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。 2、项目的业务流程 3、项目的功能模块 4、项目的技术架构 5、个人工作职责 6、个人负责模块的详细说…...
![](https://www.ngui.cc/images/no-images.jpg)
ViewBinding——Android之视图绑定
高版本的gradle不再支持 kotlin-android-extensions插件,因此view的绑定方式也有所改变。 1.启用视图绑定 android {...viewBinding {enabled true}} 如果想在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore"true" 属性添加到…...
![](https://www.ngui.cc/images/no-images.jpg)
vue学习-04vue的props配置项和mixin混入
今天仍然就是敲vue的一个demo,vue的props配置项和mixin混入 props配置项 Vue.js 中的 props 是用于在父组件向子组件传递数据的配置项。通过 props,你可以将父组件中的数据传递给子组件,并在子组件中使用这些数据。以下是关于 props 配置项…...
![](https://img-blog.csdnimg.cn/e0c8f40ff80f46f99a87e858bafc1bfa.png)
九、多项式朴素贝叶斯算法(Multinomial NB,Multinomial Naive Bayes)(有监督学习)
Multinomial Naive Bayes:用于多项式模型的Naive Bayes分类器 一、算法思路 多项式Naive Bayes分类器适用于离散特征分类(如文本分类中的字数) 多叉分布通常需要整数特征计数 不过,在实际应用中,分数计数(…...
![](https://img-blog.csdnimg.cn/86d3c8cd7ebe4bcb8ecc197f74dfa78f.png)
数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释
文章目录 单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数,设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数&…...
![](https://img-blog.csdnimg.cn/img_convert/a5be7ea9c4f2ab6511d0efd9d3d9d0c4.jpeg)
如何通过AI视频智能分析技术,构建着装规范检测/工装穿戴检测系统?
众所周知,规范着装在很多场景中起着重要的作用。违规着装极易增加安全隐患,并且引发安全事故和质量问题,例如,在化工工厂中,倘若员工没有穿戴符合要求的特殊防护服和安全鞋,将有极大可能受到有害物质的侵害…...
![](https://img-blog.csdnimg.cn/8c8768b4cf164c429aae3c619b620eea.png)
C语言自定义类型(上)
大家好,我们又见面了,这一次我们来学习一些C语言有关于自定义类型的结构。 目录 1.结构体 2位段 1.结构体 前面我们已经学习了一些有关于结构体的知识,现在我们进行深入的学习有关于它的知识。 结构是一些值的集合,这些值称为…...
![](https://www.ngui.cc/images/no-images.jpg)
Python - 小玩意 - 圣诞树背景音乐弹窗
import turtle as t import tkinter as tk import pygame import random as r import threading import time# 初始化背景音乐 def initialize_music():file r"./music/周杰伦-蜗牛.mp3"pygame.mixer.init()pygame.mixer.music.load(file)pygame.mixer.music.play()…...
![](https://img-blog.csdnimg.cn/130f9773fde24b84aa2c078729dd708a.jpeg)
The 2023 ICPC Asia Regionals Online Contest (1) E. Magical Pair(数论 欧拉函数)
题目 T(T<10)组样例,每次给出一个n(2<n<1e18), 询问多少对,满足 答案对998244353取模,保证n-1不是998244353倍数 思路来源 OEIS、SSerxhs、官方题解 2023 ICPC 网络赛 第一场简要题解 - 知乎 题解 官方题解还没有…...
![](https://img-blog.csdnimg.cn/5f508074853e4d8aab8603a0a2387c07.gif#pic_center)
<十三>objectARX开发:模拟实现CAD的移动Move命令
一、目的 实现类似于CAD的移动命令,选择对象,移动到指定位置,移动过程中对象跟随鼠标移动。效果如下: 二、关键步骤 选择对象,打开实体判断类型:acedEntSel()、acdbOpenObject()、isKindOf()。指定基点:acedGetPoint()。移动模型,追踪光标移动对象实体:acedGrRead()…...
![](https://www.ngui.cc/images/no-images.jpg)
Autosar基础:模式管理-EcuM
ECUM目录 前言一、ECUM状态机二、Fixed和Flexible模式的区别与联系三、状态详解3.1.Startup3.2.UP3.3.RUN3.4.Sleep3.5.Shutdown三、EcuM唤醒源3.1 CAN Trcv唤醒3.2 唤醒后操作前言 根据Autosar对于模式管理的需求定义,模式管理有以下模块: ①ECU State Manager(EcuM):管理…...
![](https://www.ngui.cc/images/no-images.jpg)
代码随想录Day42 | 01背包问题| 416. 分割等和子集
01背包问题(Acwing) 有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入…...
![](https://img-blog.csdnimg.cn/img_convert/3db94cbd708fd3100b10caf74cbd3c51.png)
UML六大关系总结
UML六大关系有:继承、关系、聚合、组合、实现、依赖。分为通过图和代码总结这些关系。 1、继承 继承(Inheritance):表示类之间的继承关系,子类继承父类的属性和方法,并可以添加自己的扩展。 继承&#x…...
![](https://img-blog.csdnimg.cn/f18b605ee9984ac1b943f30e55d29a50.jpeg)
ElementUI基本介绍及登录注册案例演示
目录 前言 一.简介 二.优缺点 三.Element完成登录注册 1. 环境配置及前端演示 1.1 安装Element-UI模块 1.2 安装axios和qs(发送get请求和post请求) 1.3 导入依赖 2 页面布局 2.1组件与界面 3.方法实现功能数据交互 3.1 通过方法进行页面跳转 3.2 axios发送get请求 …...
![](https://img-blog.csdnimg.cn/134fa22e85434f7b82b1f0aa62c0591c.png)
Python爬虫-某网酒店评论数据
前言 本文是该专栏的第6篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某网的酒店数据为例,采集对应酒店的评论数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 注意:本文的案例“数据集”,选用的是本专栏上一篇“Python爬虫-某网酒店数…...
![](https://img-blog.csdnimg.cn/bceb5732cad64cb7a55c694c74b7f945.png)
C# Onnx Yolov8 Detect 水果识别
效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...
![](https://img-blog.csdnimg.cn/e2aa507f908241a68e4fc6cc895a53f5.png)
测试网页调用本地可执行程序(续1:解析参数中的中文编码)
学习测试网页调用本地可执行程序还遗留一个问题,即网页中调用带中文参数的命令时,本地可执行程序接收到的参数字符串里的中文都转换成了编码模式,看起来如下所示: <a href TestPageCall:-a你好>启动测试程序</a><…...
![](https://img-blog.csdnimg.cn/d9180220903c478a92e101fc07679da2.png)
C++入门知识
Hello,今天我们分享一些关于C入门的知识,看完至少让你为后面的类和对象有一定的基础,所以在讲类和对象的时候,我们需要来了解一些关于C入门的知识。 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对…...
![](https://www.ngui.cc/images/no-images.jpg)
spring和springmvc常用注解
1.Spring常用注解: 1)Repository将DAO类声明为Bean 2)Service用于修饰service层的组件 3)Controller通常作用在控制层,将在Spring MVC中使用 4)Component是一个泛化的概念,仅仅表示spring中的一…...
![](https://www.ngui.cc/images/no-images.jpg)
【Java】Java生成PDF工具类
Java生成PDF工具类 一、介绍 Java生成PDF工具类是一个非常实用的工具类,可以帮助我们以程序化的方式生成PDF文件。通过该工具类,我们可以向PDF文件中添加文字、图片、表格等多种内容,并且可以进行格式化和样式设置。Java生成PDF工具类常用于…...
![](https://www.ngui.cc/images/no-images.jpg)
STL map,插入和查找的一些注意事项
01、前言(废话) C 的 std::map 容器中插入键值对主要有myMap(std::make_pair(key value)) ,它们的区别你了解吗? auto it myMap,find(key) 和 auto value myMap[key] 都可以用于在 C 的 std::map 容器中查找键对应的值ÿ…...
![](https://img-blog.csdnimg.cn/b4555d41f91c4cd9b22ee1a0174bcd6e.png)
基于springboot+vue的客户关系管理系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
![](https://img-blog.csdnimg.cn/3a396b920ad84cd0a809bac5055ce06d.png)
【Java 基础篇】Java Stream 流详解
Java Stream(流)是Java 8引入的一个强大的新特性,用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据,可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…...
![](https://www.ngui.cc/images/no-images.jpg)
题解:ABC321A - 321-like Checker
题解:ABC321A - 321-like Checker 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:C。 思维难度:C。 调码难度:C。 综合评价:见洛谷链接。 算法 模拟。 思路 输入n后从后往前依次抽…...
![](https://img-blog.csdnimg.cn/4b68ab16250b46fc8ba093cc5f1e9bab.png)
Zig实现Hello World
1. 什么是zig 先列出一段官方的介绍: Zig is a general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software. 大概意思就是说: Zig是一种通用编程语言和工具链,用于维护健壮、最佳和可重用的软件。 官…...
![](/images/no-images.jpg)
网站功能测试内容/如何做好关键词的优化
修改hosts 先到https://www.ipaddress.com/上查询github.com和github.global.ssl.fastly.net最快的ip,然后在etc/hosts文件下新增: 140.82.113.3 github.com 151.101.185.194 github.global.ssl.fastly.net注意上面的151.101.185.194是我查询github.gl…...
![](/images/no-images.jpg)
溧阳做网站的哪家好/郑州网站制作推广公司
Java正则表达式中的字符类使用方括号“ []”定义,该子表达式与指定字符或一组可能的字符中的单个字符匹配。例如,正则表达式[abc]匹配单个字符a或b或c。字符类的range变体允许您使用字符的范围,即表达式[az]匹配字母a至z中的单个字符…...
![](https://img-blog.csdnimg.cn/img_convert/6387afb658f76ada5c9efa00ecdb53b3.png)
香港服务器网站/互联网推广工作好做吗
1、登录支付宝1、打开支付宝官网,以“我是支付宝商家”用户登录https://www.alipay.com/2、进入“产品中心”,选择并申请支付类型2、签约“电脑网站支付”产品选择支付产品类型填写签约信息后,提交申请申请成功后,我们在签约产品列…...
![](https://img-blog.csdnimg.cn/img_convert/2847c6ddba8109e552d1689713452458.png)
新疆建设云网站办理程序/微信拓客的最新方法
复盘微信支付金额不正确问题—PHP浮点型计算2020-11-15 11:58:29一、背景在做微信支付项目的时候,微信要求金额的单位必须为分,而数据库中订单金额单位是元,所以使用订单金额*100是正确的做法,但是会经常出现少一分钱的状况&#…...
宿州哪有做网站的/惠州大亚湾经济技术开发区
模块说白了就是别写好的代码,拿过来知道怎么用结果是什么就好了,不用知道底层怎么实现的。文件的名字与模块的名字不要重复, 时间模块有三种格式 - 时间戳时间 浮点数,秒为单位 - 结构化时间 元组 - 格式化时间 str数据类型 …...
个人如何建网站/自媒体是如何赚钱的
//logger.h/*//类名:CLogger//功能介绍:Win平台日志记录功能,多线程安全,支持写日志级别的设置,日志格式包含日志等级,日志时间,文件名,行号信息//作者:sunflover 2016-1…...