刚学C写的东西,纪念下:)

用C/C++编写零依赖终端爱心表白程序:从数学曲线到动态动画 在计算机图形学中,将数学曲线转化为终端字符画是一种经典的编程实践。通过心形曲线的参数方程或隐式方程,程序可以逐点判断坐标是否属于图形内部,从而在命令行输出爱心图案。基于C语言与C++实现的解决方案,具有零依赖、单文件可执行的特点,不依赖解释器或运行时环境,适合作为跨平台的小型演示项目。这类技术常被用于生成个性化的表白代码,也可以作为初学者理解循环、坐标映射与终端控制的入门练习。从静态打印到动态跳动,再到ANSI颜色控制,整个过程揭示了终端动画的基本原理。本文围绕C/C++编写无毒、可审查的爱心程序,给出完整 阅读详情

这个程序用来模拟从串口读出NMEA协议的数据并校检和解析~~

因为刚用C,C++写代码,写的应该还蛮难看的~~

#include <iostream>
#include <fstream>

#include <sys/select.h>


//author:snail
//070403

typedef unsigned char U8;
typedef signed int S32;
typedef unsigned short int U16;
typedef signed short int S16;
typedef unsigned int U32;



using namespace std;

//##################################################################################
//utility method!!!
//##################################################################################
void millisleep(int ms)                               //sleep some million seconds
{
    if (ms>0) {
        struct timeval tv;
        tv.tv_sec=0;
        tv.tv_usec=ms*1000;
        select(0, 0, 0, 0, &tv);
    }
}

unsigned char Hex2ToUint8(unsigned char *ahex) {
    unsigned char sum,Ch;

    if ((Ch=*ahex++)<='9')
        sum=Ch-'0';
    else
        sum=Ch-'A'+10;
    if ((Ch=*ahex)<='9')
        sum=sum*16+Ch-'0';
    else
        sum=sum*16+Ch-'A'+10;

    return sum;
}

int cstringToInt(char* str,char len) {
    int sum=0;
    for (char i=0; i<len; i++) {
        sum=sum*10+str[i]-'0';
    }
    return sum;
}

double cstringToDouble(char* str,char len) {
    char* dotPtr = strchr(str,'.');
    char intLen = dotPtr - str;
    char douLen = len -intLen -1;
    int douPart = cstringToInt(dotPtr+1,douLen);
    int div = 1;
    for (int i=0;i<douLen;i++) {
        div*=10;
    }
    return cstringToInt(str,intLen)+((double)douPart)/div;
}

double negcstringToDouble(char* str,char len) {
    if (*str=='-')return 0-cstringToDouble(str+1,len-1);
    else return cstringToDouble(str,len);
}

//##################################################################################
//utility method!!!
//##################################################################################









//###################################################################################
// NMEAæpackage checkSumæ
//###################################################################################
bool __gpsCheckSum(unsigned char *buf,unsigned char len) {
    cout << "begine  checkSum!!" << endl;

    unsigned char  i,chksum,value=0;

    chksum=Hex2ToUint8(&buf[len-2]);

    len-=3;
    for (i=1;i<len;i++)
        value^= buf[i];
    if (chksum==value)
        return true;
    return false;
}
//###################################################################################
//###################################################################################
//###################################################################################












//###################################################################################
//###########################struct    userfule data ################################
//###################################################################################
struct _NMEA_DATA {
    S32 Latitude;                     //1/60000 deg
    S32 Longitude;                    //1/60000 deg
    S16 Altitude;                     //mm
    U16 Speed;                        //km/h
    U16 Azimuth;                      //1e-5 deg
    U16 Year;
    U8 Mon;
    U8 Day;
    U8 Hour;
    U8 Min;
    U8 Sec;
    U8 GPSfix;                          //0=no fix,2=2D-fix,3=3D-fix,5=Time only fix
    U8 SVnum;                          //æ
};

void DEBUGINFO(_NMEA_DATA& data) {
    cout << "#######################################################################/n";
    cout << "receive a gps message!/n";
    cout << "Year: " << (int)data.Year <<"/n";
    cout << "Month: " << (int)data.Mon <<"/n";
    cout << "Day: " << (int)data.Day <<"/n";
    cout << "Hour: " << (int)data.Hour << "/n";
    cout << "Minute: " << (int)data.Min << "/n";
    cout << "Sec: " << (int)data.Sec << "/n";
    cout << "Sate: " << (int)data.SVnum << "/n";
    cout <<  "Latitude:"  << data.Latitude << '/n';
    cout <<  "Longitude:"  << data.Longitude << '/n';
    cout <<  "Speed:"   << data.Speed << '/n';
    cout <<  "Azimuth" <<data.Azimuth << '/n';
    cout << "GPSFix: " << ((data.GPSfix==1)?"fix":"notFix") << "/n";
    cout << "Altitude: " << data.Altitude << '/n';
    cout << "#######################################################################/n";
    millisleep(5000);
}
//###################################################################################
//###########################struct    userfule data ################################
//###################################################################################












//############################################################################################
//################################## vitrual    serialPort####################################
//############################################################################################
//############################################################################################
class SmallPort {
public:
    SmallPort(ifstream&stream):in(stream) {};
    int readLine(char *,uint);
    int size();
protected:
    int readBlock(char *,int);
    ifstream& in;
};


int SmallPort::size() {                                    //read 10 char from the serialPort one time
    return 10;
}

int SmallPort::readBlock(char *c,int size) {                //read a char form file
    in.get(*c);
}

int SmallPort::readLine(char *data, uint maxlen) {
    int bytesAvail=(int)size();
    char* pCur=data;

    /*if nothing waiting, return 0 length*/
    if (bytesAvail<1) {
        return 0;
    }

    /*read a byte at a time for MIN(bytesAvail, maxlen) iterations, or until a newline*/
    while (pCur<(data+bytesAvail) && --maxlen) {
        readBlock(pCur, 1);
        if (*pCur++ == '/n') {
            break;
        }
    }
    *pCur++='/0';

    /*return size of data read*/
    return (pCur-data);
}
//############################################################################################
//################################## vitrual serialPort#######################################
//############################################################################################
//############################################################################################


















//############################################################################################
//#####################################PortDataParser#########################################
//############################################################################################
//############################################################################################
class PortDataParser {
public:
    void start();
private:
    void parse();
    int __ggaLength;
    int __rmcLength;
    char __buffer[1000];
    char __ggaBuffer[1000];
    char __rmcBuffer[1000];
};




//###################################################################################
//ä¾startParseNMEADataå
//###################################################################################
void PortDataParser::parse(void) {
    _NMEA_DATA data;

    if (__ggaLength==-1 || __rmcLength==-1) {
        return;
    }

    //**************************************************************
    //ä»$GPGGAç¬ get  the satellite number (between 7-8 comma)¸ª
    //**************************************************************
    {
        char *ptr;
        ptr = __ggaBuffer;
        for (int i=0; i<7; i++) {
            if ((ptr = strchr(ptr+1,','))==NULL) return;
        }
        char* ptrNext=strchr(ptr+1,',');
        if (ptrNext == NULL)return;
        if ( ptrNext-ptr>0) {
            data.SVnum = (U8)cstringToInt(ptr+1, ptrNext-ptr);
        } else {
            data.SVnum = 0;
        }

        ptr=ptrNext+1;

        if ((ptrNext = strchr(ptr,','))==NULL) return;

        ptr=ptrNext+1;

        if ((ptrNext = strchr(ptr,','))==NULL) return;

        if ((ptrNext-ptr)>0) {
            data.Altitude = (S16)negcstringToDouble(ptr,ptrNext-ptr);
        }

    }
    //**************************************************************
    //**************************************************************



    //**************************************************************
    //ä»$GPRMCä
    //**************************************************************
    char *ptr;
    char *ptrNext;
    ptr = __rmcBuffer;
    cout << "/n rmcbuffer->" << ptr;
    if ((ptr = strchr(ptr,',')) == NULL) return;

    ptr++;

    ptrNext=strchr(ptr,',');
    if ((ptrNext-ptr)==9) {
        data.Hour = (U8)cstringToInt(ptr,2);
        data.Min = (U8)cstringToInt(ptr+2,2);
        data.Sec = (U8)cstringToInt(ptr+4,2);
    }


    //第¯GPSæ
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if (*ptr=='A') data.GPSfix=1;
    else data.GPSfix = 0;

    //ç¬longitudeï¼ ddmm.mmmmï¼
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if ((ptrNext-ptr)>0) {
        double d = cstringToDouble(ptr,ptrNext-ptr);
        data.Longitude = (S32)((d-40*((int)d/100))*1000);
    }


    //ç¬(æN or S)
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if (*ptr=='S') data.Longitude = 0 - data.Longitude;


    //ç¬( latitude  ddmm.mmmm)
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if ((ptrNext-ptr)>0) {
        double d = cstringToDouble(ptr,ptrNext-ptr);
        data.Latitude = (S32)((d-40*((int)d/100))*1000);
    }

    //· (E or W)
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if (*ptr=='W') data.Latitude = 0 - data.Latitude;

    //ç(spd,knots )
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if ((ptrNext-ptr)>0) {
        data.Speed = (int)(cstringToDouble(ptr,ptrNext-ptr)*18.42);
    }

    //ç(cog,degrees);
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if ((ptrNext-ptr)>0) {
        data.Azimuth = (int)(cstringToDouble(ptr,ptrNext-ptr)*10);
    }

    //ç¬( ddmmyy);
    ptr = ptrNext+1;
    if ((ptrNext = strchr(ptr,','))==NULL) return;
    if ((ptrNext-ptr)==6) {
        data.Day = (U8)cstringToInt(ptr,2);
        data.Mon= (U8)cstringToInt(ptr+2,2);
        data.Year = (U16)cstringToInt(ptr+4,2);
    }
    //**************************************************************
    //**************************************************************


//---------------------------------------------------------------------------------------------------------------------------------------
    DEBUGINFO(data);
//---------------------------------------------------------------------------------------------------------------------------------------

    __ggaLength = -1;
    __rmcLength = -1;
}

void PortDataParser::start() {
    ifstream in("./data");
    SmallPort testPort(in);

    int time = 0;
    while (time++<=10) {

        cout << "/n/n/n/n/n/n/n  start load ! /n";

        //############################################################################
        //1      load  some chars  from  port  to  __buffer until to  a line
        //############################################################################
        int address=0;
        bool NotMoveToBuffer = true;
        while (NotMoveToBuffer) {
            //int i = __serialPort.readLine(&__buffer[address],MAXLEN_SERIALPORT - address);
            int i = testPort.readLine(&__buffer[address],1000 - address);
            if (i>1) {
                address += i - 1;
            }
            if (i==0 || address > 1 && __buffer[address-1]!='/n') {
                //if (address >= MAXLEN_SERIALPORT)  address = 0;
                millisleep(100);
            } else    {
                NotMoveToBuffer = false;
            }
            cout << "buffer-> " << __buffer << endl << '/n';
        }

        cout << "-----------------------------------------------------------------------------------/n";
        cout << "move " << address << " bytes into buffer!" << "/n";
        cout << "-----------------------------------------------------------------------------------/n";

        //############################################################################
        // 2        start checksum
        //############################################################################
        //æfind the char'$'符ç
        int dollerAddress=-1;
        for (int i=0; i<address-1; i++) {
            if (__buffer[i] == '$' || __buffer[i]=='/n') {
                if (__buffer[i]=='$') {
                    dollerAddress = i;
                }
                break;
            }
        }

        //cout << "find '$' in " << dollerAddress << endl;
        //cout << "__buffer[address-1]" << (int)__buffer[address-1];
        //cout << "__buffer[address-2]" << (int)__buffer[address-2] << "/n";

        if (dollerAddress==-1 || __buffer[address-2]!='/r'
                ||  !__gpsCheckSum((unsigned char *)&__buffer[dollerAddress],address-dollerAddress-2)) {
            cout << "-------------------------------------------------------------------------------------------------/n";
            cout << "The data in buffer is wrong!";
            cout << "-------------------------------------------------------------------------------------------------/n";
            continue;
        }

        cout << "-----------------------------------------------------------------------------------------------------/n";
        cout << "The data in buffer is valid!";
        cout << "-----------------------------------------------------------------------------------------------------/n";

        //############################################################################
        //  3 move useful data to other buffers!
        //############################################################################
        bool parseNMEAData = false;
        if (strncmp(&__buffer[dollerAddress],"$GPGGA",6)==0) {
            __ggaLength = address-dollerAddress;
            strncpy(__ggaBuffer,&__buffer[dollerAddress],__ggaLength);
            __ggaBuffer[__ggaLength]='/0';
        } else if (strncmp(&__buffer[dollerAddress],"$GPRMC",6)==0) {
            __rmcLength =  address-dollerAddress;
            strncpy(__rmcBuffer,&__buffer[dollerAddress],__rmcLength);
            __rmcBuffer[__rmcLength]='/0';
            parseNMEAData = true;
        } else {
            continue;
        }

        //#############################################################################
        // 4 start parse!
        //#############################################################################

        if (parseNMEAData) {
            parse();
        }
    }
}



int main() {
    PortDataParser parse;
    parse.start();
    return 0;
}



这是NMEA协议的数据
$GPGSV,3,1,11,02,52,114,49,26,60,206,48,42,46,143,41,04,13,123,45*7D
$GPGSV,3,2,11,29,77,199,47,07,29,298,,06,38,283,18,08,21,073,*7C
$GPGSV,3,3,11,27,11,047,,24,42,320,27,10,56,023,*48
$GPGLL,3201.85399,N,11849.58941,E,055602.00,A,A*67
$GPZDA,055602.00,25,03,2007,00,00*63
$GPRMC,055603.00,A,3201.85411,N,11849.58933,E,0.003,,250307,,,A*7D
$GPVTG,,T,,M,0.003,N,0.005,K,A*25
$GPGGA,055603.00,3201.85411,N,11849.58933,E,1,05,3.02,49.9,M,5.3,M,,*57
$GPGSA,A,3,02,26,04,29,06,,,,,,,,3.59,3.02,1.93*08
$GPGSV,3,1,11,02,52,114,49,26,60,206,48,42,46,143,40,04,13,124,44*7A
$GPGSV,3,2,11,29,77,199,47,07,29,298,,06,38,283,16,08,21,073,*72
$GPGSV,3,3,11,27,11,047,,24,42,320,26,10,56,023,*49
$GPGLL,3201.85411,N,11849.58933,E,055603.00,A,A*64
$GPZDA,055603.00,25,03,2007,00,00*62
$GPRMC,055604.00,A,3201.85424,N,11849.58925,E,0.024,143.86,250307,,,A*68
$GPVTG,143.86,T,,M,0.024,N,0.044,K,A*33
$GPGGA,055604.00,3201.85424,N,11849.58925,E,1,05,3.03,49.7,M,5.3,M,,*5E
$GPGSA,A,3,02,26,04,29,06,,,,,,,,3.59,3.03,1.93*09
$GPGSV,3,1,11,02,52,114,49,26,60,206,48,42,46,143,41,04,13,124,44*7B
$GPGSV,3,2,11,29,77,199,47,07,29,298,,06,38,283,14,08,21,073,*70
$GPGSV,3,3,11,27,11,047,,24,42,320,27,10,56,023,*48
$GPGLL,3201.85424,N,11849.58925,E,055604.00,A,A*62
$GPZDA,055604.00,25,03,2007,00,00*65
$GPRMC,055605.00,A,3201.85438,N,11849.58918,E,0.009,,250307,,,A*73
$GPVTG,,T,,M,0.009,N,0.016,K,A*2D
$GPGGA,055605.00,3201.85438,N,11849.58918,E,1,05,3.03,49.5,M,5.3,M,,*5E


程序运行后的结果
#######################################################################
receive a gps message!
Year: 7
Month: 3
Day: 25
Hour: 5
Minute: 56
Sec: 4
Sate: 46
Latitude:7129589
Longitude:1921854
Speed:0
Azimuth1438
GPSFix: fix
Altitude: 49
#######################################################################

科技中介服务机构如何高效完成技术成果的筛选与匹配服务?.docx 科技中介服务机构如何高效完成技术成果的筛选与匹配服务? 立即下载

相关推荐

coppeliasim+gym+sac机械臂到位实验

urdf文件

【C/C++】Sleep函数的用法

Sleep函数 功能: 执行挂起一段时间,也就是等待一段时间在继续执行 用法:Sleep(时间) 头文件:Windows下为--> windows.h      Linux 下为 --> unistd.h 注意:(1)Sleep是区分大小写的,有的编译器是大写,有的是小写。    (2)Sleep括号里的时间,在windows下是已毫秒为单位,而Linux是以秒为单位 #includ

皓皓松的博客 24万+

产业园区如何通过数智工具精准识别企业技术需求,提高服务匹配效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

C++中的Sleep() 函数

转载自:http://blog.sina.com.cn/s/blog_a04184c101010kq6.html 标准库中无该函数,但在某些编译系统中有,在有些系统库中有,要根据你那边的环境而定。 如: linux中有,unsigned int sleep(unsigned int seconds),传入挂起时间,成功返回0,不成功则返回余下的秒数。 windows系统中有Sleep函数(

Lavi的专栏 3万+

搜素引擎+p2p+电脑全域搜素+快速检索文件

快速搜索电脑内一切文件,反应超快

三相电压型PWM整流器PI双闭环控制Matlab仿真

内容概要:本文系统介绍了三相电压型PWM整流器的PI双闭环控制系统在Matlab/Simulink环境下的建模与仿真方法,重点阐述电压外环与电流内环的协同控制机制,通过PI调节器实现直流侧电压稳定控制及交流侧单位功率因数运行。内容涵盖电压定向控制(VOC)、空间矢量PWM(SVPWM)调制策略、电网不平衡条件下的功率平衡控制等关键技术,并延伸至维也纳(Vienna)整流器、中点电压平衡、滞环电流控制等多种先进拓扑与控制方法。配套提供Mathcad计算书,支持不同功率等级下的参数设计、闭环建模与工程化实现,形成从理论分析到仿真验证的完整技术链条,适用于电力电子系统科研与教学实践。; 适合人群:电气工程、电力电子及相关专业的研究生、科研人员,以及具备Matlab/Simulink仿真基础的工程技术人员。; 使用场景及目标:① 掌握三相PWM整流器双闭环PI控制系统的建模、仿真与动态性能分析;② 深入理解电压定向控制、SVPWM调制及电网不平衡工况下的先进控制策略;③ 利用Mathcad计算工具完成实际工程中整流器的参数设计与优化。; 阅读建议:建议结合Simulink仿真模型与Mathcad计算书同步学习,重点关注控制架构搭建、PI参数整定方法、系统稳定性分析及不同工况下的仿真验证,通过反复调试提升对控制性能的理解与工程应用能力。

C++中sleep()函数

标准库中无sleep函数,但在某些编译系统中是有的,在有些系统库中也有,要根据环境而定。 如: linux中有,unsigned int sleep(unsigned intseconds),传入挂起时间,成功返回0,不成功则返回余下的秒数(这里sleep(1),暂停1s)。 windows系统中有Sleep函数(注意大写),void Sleep(DWORD dwMilliseconds);

Swxctx 3万+

Xilinx FPGA中利用JTAG实现MicroBlaze调试信息输出

本文详细介绍了在Xilinx FPGA开发中,如何利用JTAG接口为MicroBlaze软核处理器实现调试信息输出的完整方案。通过配置调试模块、设置Vitis软件工程以及使用XSCT工具,开发者可以建立一条不依赖外部硬件的可靠调试通道,有效解决早期硬件验证阶段串口不可用的问题,大幅提升调试效率。

weixin_29201859的博客 289

GPS设计思路

GPS模块设计思路与学习总结目录 1.组成结构 2.实现思路 2.1. GPS助手 2.2. UBX协议 2.3. RTCM微型无人机连接 2.4. 项目管理的定义 2.5. GPS管理器 2.6. GPS位置信息 2.7. GPS提供商 2.8. 卫星信息 2.9. 飞行器GPS位置 3.GPS相关资料 4.总结 1.组成结构 Drivers/src\ (驱动程序资源包) gps_helper

L_zhoutao的博客 5219

从零搭建自动驾驶仿真环境:我的Nuplan-devkit实战笔记(含PyCharm配置技巧)

本文详细记录了从零搭建Nuplan-devkit自动驾驶仿真环境的完整流程,包括conda环境配置、pip版本控制、PyCharm专业版集成等关键步骤。特别针对Ubuntu系统下的依赖管理、数据目录优化和性能调优提供了实用技巧,帮助开发者高效构建稳定的自动驾驶仿真开发环境。

weixin_30505225的博客 479

原理图分享二(信盈达CorexM4核心板STM32F407VGT6)

这是第二张板子的原理图分享,这也是当时大学里学习的一个板子。 原理图分享二(信盈达CorexM4核心板STM32F407VGT6)

让学习成为一种习惯 6891

四年旅程,一路成长——小雨的创作纪念日

🌈 你好呀,我是小雨,一个充满好奇心的ENFP,正在不断提升能力以满足前者。 🌌 2024每日百字篆刻时光,感谢你的陪伴和支持! 🌟 争取每周二开展粉丝福利送书活动,欢迎关注 ~ 🚀 定期自动回三,欢迎加好友互动 ~ 私信说一下噢 可在专栏中快速找到: 【网络安全】AIGC最新论文、现代密码、量子通信 【快速实战】Python、图像分类、文本摘要

定期分享我的发现和想法,感谢你的陪伴和支持 1万+

Solidworks二次开发(C# .NET API):从零构建装配体与虚拟零件

本文详细介绍了使用C#进行Solidworks二次开发,从零构建装配体与虚拟零件的完整流程。通过.NET API实现设计自动化,涵盖环境搭建、核心对象模型、虚拟零件创建与外部化保存等关键技术,帮助工程师将重复性建模工作程序化,大幅提升设计效率与标准化水平。

alice7model的博客 607

学习之路纪念

仅仅只是记录一下我的学习生涯,仅此而已。

m0_74189279的博客 614

告别安装报错!保姆级教程:用阿狸狗破戒大师V3.2.6搞定Cadence 17.4完整安装与补丁

本文提供Cadence 17.4的完整安装与破解教程,特别针对国内用户常见问题优化。从前期准备、镜像处理到阿狸狗破戒大师V3.2.6的智能破解,再到补丁管理与性能调优,详细指导每一步操作,确保一次性安装成功并提升设计效率。

weixin_30632089的博客 833

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 404

用c语言写成电脑计时小程序

开头 光速完成博客,因为最近忙到爆,一直没写博客,所以来写一篇凑凑数。 ~ 这是我之前刚学c语时,写的一个小的电脑小程序,就是用c,所以没有任何的面向对象,也没有类。不过想法感觉很有意思。 ~ 光速完成,最近太忙,打比赛,做答辩QAQ ~ 介绍 ~ 是一个用于计时的小软件,极为的小,只能拿来看看,并没有过大的实用价值的exe. 主要用于记录,你的电脑时间,然后记下来,存在txt文档中。 背景 ~ 现当代程序员,用电脑总是过量使用,以及熬夜,所以,写了这么一个框框程序。一个框框,显示你的使用时间。 ...

fightte的博客 2064

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 596

三元运算符的优先级

在QT2.3.10的源代码中看到如下使用三元运算符的方法,但不知道具体的运算的顺序    const QCanvasItem* i1 = s1 ?       (const QCanvasItem*)s1 : p1 ?       (const QCanvasItem*)p1 : r1 ?       (const QCanvasItem*)r1 : e1 ?       (const QCa

飞羽飞の猪の博客 4346

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

写了个测试vector,map存取的小程序

#include #include #include using namespace std;class object{public:    object():id(objectsum++),name("object"){ cout     ~object(){cout     object(const object& o){id = o.id;name = "object_copy"; cout

飞羽飞の猪の博客 1574

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[初]对于C++内存模型的一个测试小程序

#include #include using namespace std;//对于C++内存模型的一个测试小程序 //author:snail//date:2007-03-02//*class MemoryKiller{public:     MemoryKiller(){};private:    int bigMemory[1024*1024];  };//全局区(静态区

飞羽飞の猪の博客 1072

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[初]snail关于C++指针与内存管理的一些备忘

snail关于C++指针与内存管理的一些备忘Author:snail 有点乱,而且还在整理中~~最近一直在关注程序的内存管理~所以把一些看过的资料做个索引,做个备忘    ---------------snail   07年3月2日(希望璐璐看了会有点帮助,这下面的资料有任何问题都可以问我) 1 C++内存管理详解http://blog.youkuaiyun.com/sna

飞羽飞の猪の博客 1047

对象揭秘[LanJoyner]--第三章 模块与导入

        大致扫了下第3章,模块与导入。写作风格大致是LanJoyner批判C++的某些不是,然后以Java,Eiffel的在这方面的优势来比较论述的。作为程序员。从我的观点出发,这一章是写的非常客观的。我大致有2年的C++开发经验和2年的Java开发经验。而且是不断切换(而不是中间断层)这两种技术解决工作上的问题的。所以深有感触。虽然项目不大,但

飞羽飞の猪の博客 845
上一篇: [初]C++ 的 声明&定义&初始化
下一篇: [初]小议typedef
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值