C/C++学习讨论

在加入学习讨论群前,请阅读下面代码或题目,将答案或者想法作为入群口令(以下题目三选一),
谢谢合作,拒绝伸手党!(三题都做对者,可以申请群管理)
分析题目,需要分析代码中主要问题,并给出合理解释或者改进意见

题目一:
请回答C/C++类的三大特性:


题目二:请分析以下shell脚本存在的问题(语法问题或者书写问题并不是主要问题)

mathread/basefunc.sh 文件中代码如下

#!/bin/ksh

function LOG
{
    typeset time=$(date +%Y%m%d)
    typeset functionName=$1
    typeset lineNo=$2
    typeset msg=$3
    typeset findNo=$(find . -name /home/log/test.log | wc -l)
    if [ "X${findNo}" = "X0" ];then
        touch test.log
    fi
    echo "[${time}][${functionName}][${lineNo}]:${msg}"
    echo "[${time}][${functionName}][${lineNo}]:${msg}" >>test.log

    return 0
}

function mytestfunc
{
    typeset function=$1
    LOG "mytestrfunc" "${LINENO}" "will test ${function}."
    ./"${function}"
    if [ $? -ne 0 ];then
        LOG "mytestfunc" "${LINENO}" "execute ${function} failed, please check!"
        echo "error reason" >"/hone/log/${function}.errortest.log"
    fi
    return 0
}

#测试指定模块
function testfunctionModelName
{
    #获取待测试模块的测试文件
    typeset fileName=$1
    LOG "testfunctionModelName" "${LINENO}" "${fileName}-->this is -f opt test."
    mytestfunc "${fileName}"
    return 0
}

#查找执行目录下测试文件
#输出文件下的所有cpp文件模拟执行测试函数或者测试文件
function FindDirFileAndFuncForTest
{
    typeset fileName=$1

    list=""
    list=$(find ${fileName} -name "*.cpp")
    echo "[${LINENO}]find file-number: $(find ${fileName} -name "*.cpp" | wc -l)"
    for file in ${list}
    do
        testfunctionModelName "${file}"
    done

    return 0
}

function FindDirFileAndFunc
{
    typeset fileName=$1
    echo "${LINENO}-->${fileName}"
    while read -r line
    do
        echo "${line}"
        FindDirFileAndFuncForTest ${line}
    done < "${fileName}"
    return 0
}

function errorlog
{
    typeset lognum=$(find . -name "/hone/log/*.errortest.log" | wc -l)
    if [ "X${lognum}" != "X0" ];then
        echo "there some error.please check!"
        return 1
    fi
    return 0
}

mathread/dowork.sh 文件代码

#!/bin/ksh
. basefunc.sh

function main
{
    ##将软件运行时依赖的数据insert到数据库中,软件重新启动会读取数据库中数据
    su - ${usrname} -c ${dbname}/${dbpasswd}@${IP}:${port} < patchManual.sql >>"/home/log/sql.errortest.log" 2>&1 &
    if [ $? -ne 0 ];then
        LOG "main" "${LINENO}" "execute patchManual.sql failed."
        return 1
    fi

    ##执行测试脚本,执行通用函数的测试用例,这里只用一个函数代替(实际执行需要切到具体业务用户下执行)
    FindDirFileAndFuncForTest &
    if [ $? -ne 0 ];then
        LOG "main" "${LINENO}" "execute FindDirFileAndFuncForTest failed."
        return 1
    fi

    ##执行测试脚本,执行指定位置的测试函数用例,这里只用一个函数代替(实际执行需要切到具体业务用户下执行)
    FindDirFileAndFunc ${path} &
    if [ $? -ne 0 ];then
        LOG "main" "${LINENO}" "execute FindDirFileAndFuncForTest failed."
        return 1
    fi

    wait
    errorlog
    if [ $? -ne 0 ];then
        LOG "main" "${LINENO}" "execute errorlog and return 1, please check!"
        return 1
    fi

    return 0
}

main "$@"

题目三:请分析一下C/C++代码存在的问题(语法问题或者书写问题并不是主要问题)
提示:这段代码可谓是漏洞百出,这是本人刚毕业那段时间写的代码(现在贴出来都够丢人的了,错误太多了)。主要思想是,找到一段数据流中 0xdd 0xf8(图像的开始位置);0xdd 0xf9(图像的结束位置),之后把这部分写进一个*.jpg文件中,就把通过socket传输的过来的图像保存起来了。

  1. 数据类型有问题;
  2. 内存使用有问题;
  3. 这里有部分是打印信息,这是我摘代码时编译增加进去的。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <stdlib.h>

// 在数据流中查找*.jpg图像的头;如果数据流空返回0x2;如果数据流没有意义返回0x3
int FindImageHead(char *filestream){
    if (filestream == nullptr){
        return 0x2;
    }
    int length=strlen(filestream) / 4;
    std::cout << "length:" << length <<std::endl;
        if(length<=7){
        return 0x3;
    }
    char pixel[8] = "";
    char pixel1[8] = "";
    for(int i=0;i<length;++i){
        strncpy(pixel, (filestream+4*i), 4);
        strncpy(pixel1, (filestream+4*(i+1)), 4);
        std::cout<< "pixel:" << pixel << " " << "pixel1:" << pixel1 <<std::endl;
        if(*(pixel)==0xff && *(pixel1)==0xd8 ){
            return i;
        }
    }
    return 0;
}

// 在数据流中查找*.jpg图像的尾
int FindImageTail(char *filestream){
    if (filestream == nullptr){
        return 0x2;
    }
    int length=strlen(filestream) / 4;
    if(length<=7){
        return 0x3;
    }
    char pixel[8] = "";
    char pixel1[8] = "";
    for(int i=0;i<length;++i){
        strncpy(pixel, (filestream+4*i), 4);
        strncpy(pixel1, (filestream+4*(i+1)), 4);
        if(*(pixel)==0xff && *(pixel1)==0xd9 ){
            return i;
        }
    }
    return 0;
}

int main(int argc, char *argv[]){
    char imageStream[]="0x110x000x120xff0xd80x000x000x010x000x010x000x230x200x200xff0xd9";
    int imageHead = FindImageHead(imageStream);
    std::cout<<"imageHead:"<<imageHead<<std::endl;
    int imageTail = FindImageTail(imageStream);
    std::cout<<"imageTail:"<<imageTail<<std::endl;

    return 0;
}

学习讨论QQ群:41703435

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值