您的位置:首页 > 编程语言 > C语言/C++

C++:获取系统时间、将数字转换为字符串类型、函数返回指针变量(全局变量定义&new申请新空间)、字符串拼接重命名图像问题解决

2020-01-11 18:56 609 查看

涉及C++的一些简单问题

  • 2.函数返回指针变量
  • 利用new申请新空间
  • 3.字符串拼接重命名图像问题
  • 4.总的源代码:
  • 1. 如何获取系统时间问题
    2. 如何准确的为指针函数返回指针变量并在主函数调用

    • &定义全局变量
    • &利用new开辟新的内存空间地址

    3. 使用string头文件进行简单的字符串拼接问题解决**

    1.获取系统时间并将数字类型转换为字符串类型

    利用C++标准头文件windows.h可以获取毫秒级的系统时间

    构建系统时间变量即可获取系统时间

    SYSTEMTIME sys;
    GetLocalTime(&sys);

    将系统时间类型由数字转换为字符串

    • 可以先将其转换为流,然后再转换为字符串
    stringstream ss;       //定义流
    string time_;            //定义字符串类型时间
    
    ss << sys.wYear;
    ss >> time_;

    源代码如下:

    #include <iostream>
    #include <windows.h>`
    void main()
    {
    SYSTEMTIME sys;
    GetLocalTime(&sys);
    stringstream ss;       //定义流
    string time_;            //定义字符串类型时间
    
    //将数字类型变量转化为流,依次表示年/月/日/小时/分钟/秒/毫秒/周几
    ss << sys.wYear << ":" << sys.wMonth
    << ":" << sys.wDay << ":" << sys.wHour
    << ":" << sys.wMinute << ":" << sys.wSecond
    << ":" << sys.wMilliseconds << ":" << sys.wDayOfWeek;
    
    ss >> time_;          	//将流转化为字符串类型变量
    cout << time_;
    cin.get();
    }
    

    输出结果说明

    输出结果:2019年10月7日12时41分40秒997毫秒周一

    2.函数返回指针变量

    之前我写了一个返回指针变量的函数,功能就是获取系统的时间并返回系统时间变量的内存地址,但是读取在主函数中获取的内存地址中的值,一直是空,原因是对于函数中的局部变量来说,其在函数结束时就没有了,所以会出现这种情况,那么如果我们一定想从函数中返回指针变量呢,那么有两种方法:

    • 定义全局变量
    • 利用new申请新空间

    定义全局变量

    • 全局变量的定义
    string year;  //定义全局变量year,因为如果定义在子函数中,当子函数进程执行完毕,该变量会消失
    • 在子函数中定义指针并将指针指向全局变量:
    string* year_;
    year_ = &year;   //将year_指针指向year变量
    源代码如下
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    string*  gettime();      //声明指针函数
    
    //定义全局变量来返回指针函数变量
    string year;  //定义全局变量year,因为如果定义在子函数中,当子函数进程执行完毕,该变量会消失int main()
    {
    string* year_;
    year_ = gettime();
    
    cout << "主函数中输出内存地址:" << year_ << endl;
    cout << "主函数中市场及内存地址中值:" << *year_ << endl;
    
    cin.get();;
    return 0;
    }
    string* gettime()
    {
    SYSTEMTIME sys;
    GetLocalTime(&sys);
    stringstream ss;
    string* year_;
    
    ss << sys.wYear;
    ss >> year;
    
    year_ = &year;   //将year_指针指向year变量
    
    cout << "子函数中输出内存地址:" << year_ << endl;
    cout << "子函数中市场及内存地址中值:" << *year_ << endl;
    
    return year_;             //返回内存地址指针
    }
    
    输出结果

    利用new申请新空间

    我们以获取系统时间年份为例:

    • 声明指针函数
    string*  gettime();
    • 在指针函数中new新空间,并将变量值放在新空间内
    ss << sys.wYear;
    ss >> year;
    string *year_ = new string(year);
    return year_;
    源代码如下:
    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    string*  gettime();      //声明指针函数
    
    int main()
    {
    string* year_;
    year_ = gettime();
    
    cout << "主函数中输出内存地址:" << year_ << endl;
    cout << "主函数中市场及内存地址中值:" << *year_ << endl;
    //delete year_string;          //想取消新空间的话,直接delete即可
    //cout << *year_ << "mmms";
    cin.get();;
    return 0;
    }
    
    string* gettime()
    {
    SYSTEMTIME sys;
    GetLocalTime(&sys);
    stringstream ss;
    string year;
    
    ss << sys.wYear;
    ss >> year;
    
    string *year_ = new string(year);     //使用new申请新空间
    
    cout << "子函数中输出内存地址:" << year_ << endl;
    cout << "子函数中市场及内存地址中值:" << *year_ << endl;
    
    return year_;             //返回内存地址指针
    }
    
    输出结果:

    3.字符串拼接重命名图像问题

    因为想从获取系统时间来为照片命名,所以需要用到字符串拼接,之前看网上说的好复杂,其实只要使用+即可完成,感觉和python类似。

    定义一个根路径字符串和后缀名字符串:

    string head_path("E://5-MaterialPicture");
    string suffix_name(".jpg");

    opencv读取图片:

    img = imread(head_path + "//xx.jpg", 0);

    将获取的系统时间进行字符串拼接保存重命名后的图像:

    imwrite(head_path + "//" + *year_ + "_xx" + suffix_name, img);

    4.总的源代码:

    该源代码实现了获取系统时间,并将系统时间为名称进行拼接重命名图像的功能。重命名后的的图像名称为2019_xx.jpg,可以将命名名称细化到毫秒级,那么每一次保存的图像都可以保证名称不同,从而不会产生覆盖现象。

    #include <iostream>
    #include <windows.h>
    #include<opencv2/core.hpp>
    #include<opencv2/highgui.hpp>
    #include<opencv2/imgproc.hpp>
    
    using namespace std;
    using namespace cv;
    
    string*  gettime();
    int main()
    {
    string head_path("E://5-MaterialPicture");
    string suffix_name(".jpg");string* year_;
    year_ = gettime();
    
    Mat img;
    img = imread(head_path + "//xx.jpg", 0);
    imwrite(head_path + "//" + *year_ + "_xx" + suffix_name, img);imshow("ss", img);
    waitKey(0);
    
    return 0;
    }
    string* gettime()
    {
    SYSTEMTIME sys;
    GetLocalTime(&sys);
    stringstream ss;
    string year;
    
    ss << sys.wYear;
    ss >> year;
    
    string *year_ = new string(year);
    
    return year_;             //返回内存地址指针
    }
    

    2019.10.7
    希望能帮到大家。

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    jsk_learner 发布了25 篇原创文章 · 获赞 9 · 访问量 3135 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐