最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Qt開發(fā)之使用QTcpSocket實(shí)現(xiàn)TCP網(wǎng)絡(luò)通信

 更新時(shí)間:2024年03月18日 10:08:25   作者:lyshark  
Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,本文主要為大家介紹了如何運(yùn)用QTcpSocket組件實(shí)現(xiàn)基于TCP的網(wǎng)絡(luò)通信功能,需要的可以參考下

前言

Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹如何運(yùn)用QTcpSocket組件實(shí)現(xiàn)基于TCP的網(wǎng)絡(luò)通信功能。

QTcpSocketQTcpServer是Qt中用于實(shí)現(xiàn)基于TCP(Transmission Control Protocol)通信的兩個(gè)關(guān)鍵類。TCP是一種面向連接的協(xié)議,它提供可靠的、雙向的、面向字節(jié)流的通信。這兩個(gè)類允許Qt應(yīng)用程序在網(wǎng)絡(luò)上建立客戶端和服務(wù)器之間的連接。

以下是QTcpSocket類的一些常用函數(shù):

函數(shù)描述
QTcpSocket()構(gòu)造函數(shù),創(chuàng)建一個(gè)新的QTcpSocket對(duì)象。
~QTcpSocket()析構(gòu)函數(shù),釋放QTcpSocket對(duì)象及其資源。
void connectToHost(const QString &hostName, quint16 port)嘗試與指定主機(jī)名和端口建立連接。
void disconnectFromHost()斷開與主機(jī)的連接。
QAbstractSocket::SocketState state() const返回套接字的當(dāng)前狀態(tài)。
QHostAddress peerAddress() const返回與套接字連接的遠(yuǎn)程主機(jī)的地址。
quint16 peerPort() const返回與套接字連接的遠(yuǎn)程主機(jī)的端口。
QAbstractSocket::SocketError error() const返回套接字的當(dāng)前錯(cuò)誤代碼。
qint64 write(const char *data, qint64 maxSize)將數(shù)據(jù)寫入套接字,返回實(shí)際寫入的字節(jié)數(shù)。
qint64 read(char *data, qint64 maxSize)從套接字讀取數(shù)據(jù),返回實(shí)際讀取的字節(jié)數(shù)。
void readyRead()當(dāng)套接字有可供讀取的新數(shù)據(jù)時(shí)發(fā)出信號(hào)。
void bytesWritten(qint64 bytes)當(dāng)套接字已經(jīng)寫入指定字節(jié)數(shù)的數(shù)據(jù)時(shí)發(fā)出信號(hào)。
void error(QAbstractSocket::SocketError socketError)當(dāng)套接字發(fā)生錯(cuò)誤時(shí)發(fā)出信號(hào)。

以下是QTcpServer類的一些常用函數(shù)及其簡(jiǎn)要解釋:

函數(shù)描述
QTcpServer()構(gòu)造函數(shù),創(chuàng)建一個(gè)新的QTcpServer對(duì)象。
~QTcpServer()析構(gòu)函數(shù),釋放QTcpServer對(duì)象及其資源。
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)開始監(jiān)聽指定的地址和端口。
void close()停止監(jiān)聽并關(guān)閉服務(wù)器。
bool isListening() const返回服務(wù)器是否正在監(jiān)聽連接。
QList<QTcpSocket*> pendingConnections()返回等待處理的掛起連接的列表。
virtual void incomingConnection(qintptr socketDescriptor)當(dāng)有新連接時(shí)調(diào)用,可以在子類中實(shí)現(xiàn)以處理新連接。
void maxPendingConnections() const返回允許的最大掛起連接數(shù)。
void setMaxPendingConnections(int numConnections)設(shè)置允許的最大掛起連接數(shù)。
QNetworkProxy proxy() const返回服務(wù)器的代理設(shè)置。
void setProxy(const QNetworkProxy &networkProxy)設(shè)置服務(wù)器的代理設(shè)置。
QAbstractSocket::SocketError serverError() const返回服務(wù)器的當(dāng)前錯(cuò)誤代碼。
QString errorString() const返回服務(wù)器的錯(cuò)誤消息字符串。
void pauseAccepting()暫停接受新連接,但保持現(xiàn)有連接。
void resumeAccepting()恢復(fù)接受新連接。
void close()關(guān)閉服務(wù)器。

如上這些只是常用函數(shù)的簡(jiǎn)要描述,詳細(xì)的函數(shù)說明和用法可以參考Qt官方文檔或相關(guān)文檔。

1.通信的流程

1.1服務(wù)端流程

在使用TCP通信時(shí)同樣需要導(dǎo)入Qt+=network模塊,并在頭文件中引入QTcpServerQTcpSocket兩個(gè)模塊,當(dāng)有了模塊的支持,接著就是偵聽套接字,此處可通過調(diào)用server.listen來實(shí)現(xiàn)偵聽,此函數(shù)原型如下;

bool QTcpServer::listen(
    const QHostAddress &address = QHostAddress::Any, 
    quint16 port = 0
);

這個(gè)函數(shù)用于開始在指定的地址和端口上監(jiān)聽連接。它的參數(shù)包括:

  • address:一個(gè)QHostAddress對(duì)象,指定要監(jiān)聽的主機(jī)地址。默認(rèn)為QHostAddress::Any,表示監(jiān)聽所有可用的網(wǎng)絡(luò)接口。
  • port:一個(gè)quint16類型的端口號(hào),指定要監(jiān)聽的端口。如果設(shè)置為0,系統(tǒng)將選擇一個(gè)可用的未使用端口。

函數(shù)返回一個(gè)bool值,表示是否成功開始監(jiān)聽。如果成功返回true,否則返回false,并且可以通過調(diào)用errorString()獲取錯(cuò)誤消息。

緊隨套接字偵聽其后,通過使用一個(gè)waitForNewConnection等待新的連接到達(dá)。它的原型如下:

bool QTcpServer::waitForNewConnection(
    int msec = 0, 
    bool *timedOut = nullptr
);

該函數(shù)在服務(wù)器接受新連接之前會(huì)一直阻塞。參數(shù)包括:

  • msec:等待連接的超時(shí)時(shí)間(以毫秒為單位)。如果設(shè)置為0(默認(rèn)值),則表示無限期等待,直到有新連接到達(dá)。
  • timedOut:一個(gè)可選的布爾指針,用于指示等待是否超時(shí)。如果傳遞了此參數(shù),并且等待時(shí)間達(dá)到了指定的超時(shí)時(shí)間,*timedOut將被設(shè)置為true,否則為false。如果不關(guān)心超時(shí),可以將此參數(shù)設(shè)置為nullptr

函數(shù)返回一個(gè)布爾值,表示是否成功等待新連接。如果在超時(shí)時(shí)間內(nèi)有新連接到達(dá),返回true,否則返回false。如果等待超時(shí),可以通過檢查timedOut參數(shù)來確定。如果函數(shù)返回false,可以通過調(diào)用errorString()獲取錯(cuò)誤消息。

套接字的接收會(huì)使用nextPendingConnection()函數(shù)來實(shí)現(xiàn),nextPendingConnection 是 QTcpServer 類的成員函數(shù),用于獲取下一個(gè)已接受的連接的套接字(QTcpSocket)。它的原型如下:

QTcpSocket *QTcpServer::nextPendingConnection();

函數(shù)返回一個(gè)指向新連接套接字的指針。如果沒有已接受的連接,則返回 nullptr

使用這個(gè)函數(shù),你可以在服務(wù)器接受連接之后獲取相應(yīng)的套接字,以便進(jìn)行數(shù)據(jù)傳輸和通信。一般來說,在收到 newConnection 信號(hào)后,你可以調(diào)用這個(gè)函數(shù)來獲取新連接的套接字。

當(dāng)有了套接字以后,就可以通過QTcpServer指針判斷對(duì)應(yīng)的套接字狀態(tài),一般套接字的狀態(tài)被定義在QAbstractSocket類內(nèi)。以下是QAbstractSocket類中定義的一些狀態(tài)及其對(duì)應(yīng)的標(biāo)志:

狀態(tài)標(biāo)志描述
UnconnectedState未連接狀態(tài),套接字沒有連接到遠(yuǎn)程主機(jī)。
HostLookupState正在查找主機(jī)地址狀態(tài),套接字正在解析主機(jī)名。
ConnectingState連接中狀態(tài),套接字正在嘗試與遠(yuǎn)程主機(jī)建立連接。
ConnectedState已連接狀態(tài),套接字已經(jīng)成功連接到遠(yuǎn)程主機(jī)。
BoundState已綁定狀態(tài),套接字已經(jīng)與地址和端口綁定。
ClosingState關(guān)閉中狀態(tài),套接字正在關(guān)閉連接。
ListeningState監(jiān)聽中狀態(tài),用于QTcpServer,表示服務(wù)器正在監(jiān)聽連接。

這些狀態(tài)反映了套接字在不同階段的連接和通信狀態(tài)。在實(shí)際使用中,可以通過調(diào)用state()函數(shù)獲取當(dāng)前套接字的狀態(tài),并根據(jù)需要處理相應(yīng)的狀態(tài)。例如,可以使用信號(hào)和槽機(jī)制來捕獲狀態(tài)變化,以便在連接建立或斷開時(shí)執(zhí)行相應(yīng)的操作。

當(dāng)套接字被連接后則可以通過socket->write()方法向上線客戶端發(fā)送一個(gè)字符串,此處我們以發(fā)送lyshark為例,發(fā)送時(shí)需要向write()中傳入兩個(gè)參數(shù)。其原型如下:

qint64 QTcpSocket::write(const char *data, qint64 maxSize);

該函數(shù)接受兩個(gè)參數(shù):

  • data:指向要寫入套接字的數(shù)據(jù)的指針。
  • maxSize:要寫入的數(shù)據(jù)的最大字節(jié)數(shù)。

函數(shù)返回實(shí)際寫入的字節(jié)數(shù),如果發(fā)生錯(cuò)誤,則返回 -1。在寫入數(shù)據(jù)之后,可以使用 bytesWritten 信號(hào)來獲取寫入的字節(jié)數(shù)。此外,你也可以使用 waitForBytesWritten 函數(shù)來阻塞等待直到所有數(shù)據(jù)都被寫入。

至此服務(wù)端代碼可總結(jié)為如下案例;

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpServer server;

    server.listen(QHostAddress::Any,9000);
    server.waitForNewConnection(100000);

    QTcpSocket *socket;

    socket = server.nextPendingConnection();
    if(socket->state() && QAbstractSocket::ConnectedState)
    {
        QByteArray bytes = QString("lyshark").toUtf8();
        socket->write(bytes.data(),bytes.length());
    }

    socket->close();
    server.close();
    return a.exec();
}

1.2客戶端流程

客戶端的流程與服務(wù)端基本保持一致,唯一的區(qū)別在于將server.listen更換為socket.connectToHost連接到對(duì)應(yīng)的主機(jī),QTcpSocket 的 connectToHost 函數(shù)的原型如下:

void QTcpSocket::connectToHost(
const QString &hostName, 
quint16 port, 
OpenMode openMode = ReadWrite
);
  • hostName:遠(yuǎn)程主機(jī)的主機(jī)名或IP地址。
  • port:要連接的端口號(hào)。
  • openMode:套接字的打開模式,默認(rèn)為 ReadWrite。

函數(shù)用于初始化與指定遠(yuǎn)程主機(jī)和端口的連接。在實(shí)際使用中,你可以通過調(diào)用這個(gè)函數(shù)來發(fā)起與目標(biāo)主機(jī)的連接嘗試。

讀取數(shù)據(jù)時(shí)可以使用readAll函數(shù)來實(shí)現(xiàn),socket.readAll() 是 QTcpSocket 類的成員函數(shù),用于讀取所有可用的數(shù)據(jù)并返回一個(gè) QByteArray 對(duì)象。其函數(shù)函數(shù)原型如下:

QByteArray QTcpSocket::readAll();

該函數(shù)返回一個(gè)包含從套接字中讀取的所有數(shù)據(jù)的 QByteArray 對(duì)象。通常,你可以通過這個(gè)函數(shù)來獲取已經(jīng)到達(dá)的所有數(shù)據(jù),然后對(duì)這些數(shù)據(jù)進(jìn)行進(jìn)一步的處理。其客戶端功能如下所示;

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpSocket socket;
    socket.connectToHost(QHostAddress::LocalHost,9000);

    if(socket.state() && QAbstractSocket::ConnectedState)
    {
        socket.waitForReadyRead(10000);

        QByteArray ref = socket.readAll();

        QString ref_string;

        ref_string.prepend(ref);

        std::cout << ref_string.toStdString() << std::endl;
    }

    socket.close();
    return a.exec();
}

2.圖形化應(yīng)用

2.1 服務(wù)端流程

與命令行版本的網(wǎng)絡(luò)通信不同,圖形化部分需要使用信號(hào)與槽函數(shù)進(jìn)行綁定,所有的通信流程都是基于信號(hào)的,對(duì)于服務(wù)端而言我們需要導(dǎo)入QTcpServer、QtNetwork、QTcpSocket模塊,并新增四個(gè)槽函數(shù)分別對(duì)應(yīng)四個(gè)信號(hào);

信號(hào)槽函數(shù)描述
connected()onClientConnected()當(dāng) tcpSocket 成功連接到遠(yuǎn)程主機(jī)時(shí)觸發(fā),執(zhí)行 onClientConnected() 函數(shù)。
disconnected()onClientDisconnected()當(dāng) tcpSocket 斷開連接時(shí)觸發(fā),執(zhí)行 onClientDisconnected() 函數(shù)。
stateChanged(QAbstractSocket::SocketState)onSocketStateChange(QAbstractSocket::SocketState)當(dāng) tcpSocket 的狀態(tài)發(fā)生變化時(shí)觸發(fā),執(zhí)行 onSocketStateChange() 函數(shù),傳遞新的狀態(tài)。
readyRead()onSocketReadyRead()當(dāng) tcpSocket 有可讀取的新數(shù)據(jù)時(shí)觸發(fā),執(zhí)行 onSocketReadyRead() 函數(shù)。

在程序入口處我們通過new QTcpServer(this)新建TCP套接字類,并通過connect()連接到初始化槽函數(shù)上,當(dāng)程序運(yùn)行后會(huì)首先觸發(fā)newConnection信號(hào),執(zhí)行onNewConnection槽函數(shù)。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 新建TCP套接字類
    tcpServer=new QTcpServer(this);

    // 連接信號(hào)初始化其他信號(hào)
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));
}

而在槽函數(shù)onNewConnection中,通過nextPendingConnection新建一個(gè)套接字,并綁定其他四個(gè)槽函數(shù),這里的槽函數(shù)功能各不相同,將其對(duì)應(yīng)的信號(hào)綁定到對(duì)應(yīng)槽函數(shù)上即可;

// 初始化信號(hào)槽函數(shù)
void MainWindow::onNewConnection()
{
    // 創(chuàng)建新套接字
    tcpSocket = tcpServer->nextPendingConnection();

    // 連接觸發(fā)信號(hào)
    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));
    onClientConnected();

    // 關(guān)閉觸發(fā)信號(hào)
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));

    // 狀態(tài)改變觸發(fā)信號(hào)
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());

    // 讀入數(shù)據(jù)觸發(fā)信號(hào)
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}

當(dāng)讀者點(diǎn)擊偵聽時(shí)則直接調(diào)用tcpServer->listen實(shí)現(xiàn)對(duì)本地IP的8888端口的偵聽功能,停止偵聽則是調(diào)用tcpServer->close函數(shù)實(shí)現(xiàn),如下所示;

// 開始偵聽
void MainWindow::on_pushButton_2_clicked()
{
    // 此處指定綁定本機(jī)的8888端口
    tcpServer->listen(QHostAddress::LocalHost,8888);
    ui->plainTextEdit->appendPlainText("[+] 開始監(jiān)聽");
    ui->plainTextEdit->appendPlainText(" 服務(wù)器地址:" + tcpServer->serverAddress().toString() +
                                       " 服務(wù)器端口:"+QString::number(tcpServer->serverPort())
                                       );
}

// 停止偵聽
void MainWindow::on_pushButton_3_clicked()
{
    if (tcpServer->isListening())
    {
        tcpServer->close();
    }
}

對(duì)于讀取數(shù)據(jù)可以通過canReadLine()函數(shù)判斷行,并通過tcpClient->readLine()逐行讀入數(shù)據(jù),相對(duì)應(yīng)的發(fā)送數(shù)據(jù)可通過調(diào)用tcpSocket->write函數(shù)實(shí)現(xiàn),在發(fā)送之前需要將其轉(zhuǎn)換為QByteArray類型的字符串格式,如下所示;

// 讀取數(shù)據(jù)
void MainWindow::onSocketReadyRead()
{
    while(tcpSocket->canReadLine())
        ui->plainTextEdit->appendPlainText("[接收] | " + tcpSocket->readLine());
}

// 發(fā)送數(shù)據(jù)
void MainWindow::on_pushButton_clicked()
{
    QString  msg=ui->lineEdit->text();
    ui->plainTextEdit->appendPlainText("[發(fā)送] | " + msg);

    QByteArray str=msg.toUtf8();
    str.append('\n');
    tcpSocket->write(str);
}

運(yùn)行服務(wù)端程序,并點(diǎn)擊偵聽按鈕此時(shí)將會(huì)在本地的8888端口上啟用偵聽,如下圖所示;

2.2客戶端流程

對(duì)于客戶端而言同樣需要綁定四個(gè)信號(hào)并對(duì)應(yīng)到特定的槽函數(shù)上,其初始化部分與服務(wù)端保持一致,唯一不同的是客戶端使用connectToHost函數(shù)鏈接到服務(wù)端上,斷開連接時(shí)使用的是disconnectFromHost函數(shù),如下所示;

// 連接服務(wù)器時(shí)觸發(fā)
void MainWindow::on_pushButton_2_clicked()
{
    // 連接到8888端口
    tcpClient->connectToHost(QHostAddress::LocalHost,8888);
}

// 斷開時(shí)觸發(fā)
void MainWindow::on_pushButton_3_clicked()
{
    if (tcpClient->state()==QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
}

此處的讀取數(shù)據(jù)與服務(wù)端保持一致,發(fā)送數(shù)據(jù)時(shí)則是通過tcpClient->write(str)函數(shù)直接傳遞給客戶端,代碼如下所示;

// 讀取數(shù)據(jù)時(shí)觸發(fā)
void MainWindow::onSocketReadyRead()
{
    while(tcpClient->canReadLine())
    {
        ui->plainTextEdit->appendPlainText("[接收] | " + tcpClient->readLine());
    }
}

// 發(fā)送消息時(shí)觸發(fā)
void MainWindow::on_pushButton_clicked()
{
    QString msg=ui->lineEdit->text();
    ui->plainTextEdit->appendPlainText("[發(fā)送] | " + msg);
    QByteArray str=msg.toUtf8();
    str.append('\n');
    tcpClient->write(str);
}

運(yùn)行后,服務(wù)端啟用偵聽等待客戶端連接,客戶端連接后,雙方則可以實(shí)現(xiàn)數(shù)據(jù)的收發(fā)功能,由于采用了信號(hào)機(jī)制,兩者的收發(fā)并不會(huì)阻斷可同時(shí)進(jìn)行,如下圖所示;

到此這篇關(guān)于C++ Qt開發(fā)之使用QTcpSocket實(shí)現(xiàn)TCP網(wǎng)絡(luò)通信的文章就介紹到這了,更多相關(guān)Qt QTcpSocket TCP網(wǎng)絡(luò)通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語言處理函數(shù)調(diào)用的方法

    c語言處理函數(shù)調(diào)用的方法

    函數(shù)就是一段封裝好的,可以重復(fù)使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。這篇文章主要介紹了c語言是如何處理函數(shù)調(diào)用的?需要的朋友可以參考下
    2021-11-11
  • C語言實(shí)現(xiàn)繪制余弦曲線

    C語言實(shí)現(xiàn)繪制余弦曲線

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)繪制余弦曲線的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語言實(shí)現(xiàn)隨機(jī)生成6位數(shù)密碼

    C語言實(shí)現(xiàn)隨機(jī)生成6位數(shù)密碼

    這篇文章主要為大家詳細(xì)介紹了如何使用C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單而實(shí)用的隨機(jī)密碼生成器,該生成器將生成包含字母、數(shù)字和特殊字符的隨機(jī)密碼,有需要的小伙伴可以參考下
    2023-11-11
  • C++項(xiàng)目基于HuffmanTree實(shí)現(xiàn)文件的壓縮與解壓縮功能

    C++項(xiàng)目基于HuffmanTree實(shí)現(xiàn)文件的壓縮與解壓縮功能

    這篇文章主要介紹了C++項(xiàng)目基于HuffmanTree實(shí)現(xiàn)文件的壓縮與解壓縮功能,本文給大家提到文件壓縮的概念介紹及壓縮方法,通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • C++定義和初始化string對(duì)象實(shí)例詳解

    C++定義和初始化string對(duì)象實(shí)例詳解

    這篇文章主要為大家介紹了C++定義和初始化string對(duì)象實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C語言中求字符串長度的函數(shù)的幾種實(shí)現(xiàn)方法

    C語言中求字符串長度的函數(shù)的幾種實(shí)現(xiàn)方法

    這篇文章主要介紹了C語言中求字符串長度的函數(shù)的幾種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-08-08
  • 淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存

    淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存

    下面小編就為大家?guī)硪黄獪\談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言實(shí)現(xiàn)循環(huán)打印星號(hào)圖形再鏤空

    C語言實(shí)現(xiàn)循環(huán)打印星號(hào)圖形再鏤空

    這篇文章主要介紹了C語言實(shí)現(xiàn)循環(huán)打印星號(hào)圖形再鏤空,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言代碼中調(diào)用C++代碼的方法示例

    C語言代碼中調(diào)用C++代碼的方法示例

    這篇文章主要介紹了C語言代碼中調(diào)用C++代碼的方法示例,文中也介紹了C++代碼調(diào)用C代碼的方法,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • C++小知識(shí):不要節(jié)約代碼行數(shù)

    C++小知識(shí):不要節(jié)約代碼行數(shù)

    今天小編就為大家分享一篇關(guān)于C++小知識(shí):不要節(jié)約代碼行數(shù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評(píng)論

西林县| 石泉县| 邛崃市| 米脂县| 阳东县| 姜堰市| 卓尼县| 南平市| 绍兴市| 佛山市| 普陀区| 大姚县| 改则县| 梁河县| 甘孜县| 名山县| 连平县| 铜鼓县| 永春县| 长沙市| 千阳县| 奇台县| 江华| 房产| 林口县| 邢台市| 新乡市| 东港市| 通辽市| 乌拉特前旗| 迁安市| 肃宁县| 海淀区| 和静县| 高邮市| 仁化县| 沂水县| 弥勒县| 灵武市| 慈溪市| 扶风县|