**
一、规范要求
**
1.禁止使用TAB键,将TAB键换成四个空格。
2.禁止使用非英文注释。
3.程序开头、主函数、子函数必须添加注释进行说明
4.主函数与子函数的 输入参数 和 return value(返回值)需要使用debug类型的log函数进行打印输出。
5.如果子函数的入参是指针类型的参数,必须要对对其进行判空处理,然后打印。
6.如果使用if、else if,那么必须要加上 else;同时,除了while、for等循环外,需打印if的判断条件。
7.对于枚举变量的定义,必须对每一个枚举常量进行初始化赋值。
8.变量必须初始化。
9.进行算数运算、逻辑运算等,需要在其符号左右两边添加空格,且if 和 括号之间也需要添加空格如
int i = 10; //!正确
int i=10; //!错误
if (i < 10) //!正确
if(i<10) //!错误
while ((i < 10) && (i >= 0)) //!正确 给每一个判断条件加括号
while(i<10 && i>=0) //!错误,可能会产生优先级的问题
10.switch中 每一类case语句后必须要加break,且必须以default: break语句作为结尾。
11.禁止使用strcpy()函数,使用memcpy()、strncpy()进行替代。
12.禁止使用string.data(),使用string.str()进行替代。
13.malloc-memcpy-free、new-delete、fopen/flose配对使用
**
二、演示前说明
**
1.这里将LOGT、LOGD 、LOGE分别作为Trace、Debug、Error等级的打印函数,实际情况下,请根据内部组织要求进行攥写,这里使用的log打印函数如下面链接所示:
---------------------基于C/C++的log打印函数编写
2.使用工具:Linux、ubuntu20、gcc7.4.0、secureCRT4.0、notepad++
**
三、C和指针课后题实例
**
- 4-1
/*!
****************************************************
* @File name 4-4
* @Purpose copy the string as required
* @Author Super Pallet Town Man
* @Data 2022-8-14
****************************************************
*/
#include <stido.h>
#include <string.h>
type enum
{
EN_ERROR = -1,
EN_OK = 0,
EN_SUCCESS = 1,
} EN_RETURN;
/*!
* @brief my sqrt
*
* @param[in] n float
*
* @return curCaculteSqt float
*/
float mySqrt(float n)
{
PLFAPI_TRACE("in\n");
PLFAPI_DBG("n: %d\n", n);
float preCaculteSqt = 1;
float curCaculteSqt = 0;
while (1)
{
curCaculteSqt = (preCaculteSqt + (n / preCaculteSqt))/2;
if(curCaculteSqt == preCaculteSqt)
{
break;
}
preCaculteSqt = curCaculteSqt;
}
PLFAPI_DBG("curCaculteSqt: %f\n", curCaculteSqt);
PLFAPI_TRACE("out\n");
return curCaculteSqt;
}
/*!
* @brief main function
*/
int main(int argc, char *argv[])
{
PLFAPI_TRACE("in\n");
EN_RETURN enRet = EN_OK;
float fInputNum = 0;
float fSqrtInputNum = 0;
printf("Ebter a positive number :");
scanf("%f", &inputNum);
if(fInputNum > 0)
{
fSqrtInputNum= mySqrt(fInputNum );
PLFAPI_MSG("inputNum = %f, sqrtInputNum = %f\n", fInputNum , fSqrtInputNum);
}
else
{
PLFAPI_ERR("error\n");
}
PLFAPI_DBG("ret: %d\n", enRet);
PLFAPI_TRACE("out\n");
return enRet;
}
- 4-4
/*!
****************************************************
* @File name 4-4
* @Purpose copy the string as required
* @Author Super Pallet Town Man
* @Data 2022-8-14
****************************************************
*/
#include <stido.h>
#include <string.h>
#define DST_LEN 10
#define SRC_LEN 8
type enum
{
EN_ERROR = -1,
EN_OK = 0,
EN_SUCCESS = 1,
} EN_RETURN;
/*!
* @brief my strlen
*
* @param[out] dst array
* @param[in] src array
* @param[in] n the number of characters to copy
*
*/
void copyN(char dst[], char src[], int n)
{
PLFAPI_TRACE("in\n");
EN_RETURN enReturn = EN_OK;
unsigned int uiSrcLen = 0;
unsigned int uiDstLen = 0;
int i = 0;
if ((NULL == dst) || (NULL == src)) //这里的入参数组退化为了指针,所以要进行判空操作
{
PLFAPI_ERR("dst | src is null\n");
goto END;
}
PLFAPI_DBG("dst : %s src : %s n : %d", dst, src, n)
uiSrcLen = strlen(src);
uiDstLen = strlen(dst);
if (n > uiDstLen )
{
//! 使用strncpy、strncat、memcpy要进行长度判断(极其重要!!!!)
PLFAPI_ERROR(" the length of n exceeds DST");
goto END;
}
if (src >= n)
{
strncpy(dst, src, n); //!这里使用strncpy进行有限字符复制
}
else
{
strncpy(dst, src, n);
for(i = srcLen; i < n; i++)
{
dst[i] = '\0';
}
}
END:
PLFAPI_TRACE("out\n");
return;
}
/*!
* @brief main function
*/
int main(int argc, char *argv[])
{
PLFAPI_TRACE("in\n");
int num = 3;
char dst[DST_LEN] = "SUPERMAN";
char src[SRC_LEN] = "super";
copyN(dst, src, num);
PLFAPI_ERR("After dst : %s, length = %ld\n", dst, strlen(dst));
PLFAPI_DBG("ret: %d\n", enRet);
PLFAPI_TRACE("out\n");
return enRet;
}
- 4-5
/*!
****************************************************
* @File name 4-5
* @Purpose printf the same content as adjacent lines of text
* @Author Super Pallet Town Man
* @Data 2022-8-14
****************************************************
*/
#include <stido.h>
#include <stdlib.h>
#include <string.h>
#define STR1_LEN 10
#define STR2_LEN 8
type enum
{
EN_ERROR = -2,
EN_INPUTFILE_ERROR = -1,
EN_OK = 0,
EN_SUCCESS = 1,
} EN_RETURN;
/*!
* @brief main function
*/
int main(int argc, char *argv[])
{
PLFAPI_TRACE("in\n");
enRenturn enRet = EN_OK ;
int flag = 0;
char str1[STR1_LEN] = {0};
char str2[STR2_LEN] = {0};
FILE *fp = NULL;
fp = fopen("input.txt", "r");
if (NULL == fp)
{
PLFAPI_ERR("inputfile open error\n");
enRet = EN_INPUTFILE_ERROR ;
goto END;
}
if (fgets(str2, N, fp) != NULL)
{
while (fgets(str1, N, fp) != NULL)
{
if (strcmp(str1, str2) != 0)
{
flag = 0;
if ((strlen(str1) + 1 )> STR2_LEN)
{
PLFAPI_ERR("inputfile open error\n");
enRet = EN_ERROR ;
goto END;
}
strncmp(str2, str1, (strlen(str1) + 1)); //!这里使用strncpy进行有限字符复制
}
else if (flag != 0)
{
flag = 1;
puts(str1);
}
else
{
//nothings
}
}
}
END:
if (fp != NULL)
{
fclose(fp);
fp = NULL;
}
PLFAPI_DBG("ret: %d\n", enRet);
PLFAPI_TRACE("out\n");
return enRet;
}
- 4-6
/*!
****************************************************
* @File name 4-6
* @Purpose copy the string as required
* @Author Super Pallet Town Man
* @Data 2022-8-14
****************************************************
*/
#include <stido.h>
#include <stdlib.h>
#include <string.h>
#define SRC_LEN 10
#define DST_LEN 10
type enum
{
EN_ERROR = -1,
EN_OK = 0,
EN_SUCCESS = 1,
} EN_RETURN;
/*!
* @brief substr
*
* @param[out] dst target string
* @param[in] src source string
* @param[in] start the starting position
* @param[in] len length
*
* @return 0
*/
int subStr(char dst[], char src[], int start, int len)
{
PLFAPI_TRACE("in\n");
int d = 0;
int s = 0;
int iRet = -1;
if ((NULL == dst) || (NULL == src)) //这里的入参数组退化为了指针,所以要进行判空操作
{
PLFAPI_ERR("dst | src is null\n");
goto END;
}
PLFAPI_DBG("src : %s start : %d len: %d", src, start, len);
if ((start >= 0) && (len >0))
{
for(s = 0; (s < start) && (src[s] != '\0'); s++)
{
//nothing to da
}
while ((len >0) && (src[s] != '\0'))
{
dst[d++] = src[s++];
len--;
}
dst[d] = '\0'
}
PLFAPI_DBG("dst : %s", dst); //由于前头dst内没有什么内容,打印没有意义,就把打印放在这里
iRet = 1;
END:
PLFAPI_DBG("ret: %d\n", iRet);
PLFAPI_TRACE("out\n");
return iRet;
}
/*!
* @brief main function
*/
int main(int argc, char *argv[])
{
PLFAPI_TRACE("in\n"); //LOGT为 函数的 “开始” log打印(已被封装)
EN_RETURN enRet = EN_ERROR; //返回值定义与初始化
char src[SRC_LEN] = "01234567";
char dst[DST_LEN] = {0};
PLFAPI_MSG("src is : %s,\n", src);
if (subStr(dst, src, 2, 3) == 1)
{
enRet == EN_SUCCESS;
puts(dst);
}
else
{
PLFAPI_MSG("error\n", src);
}
PLFAPI_DBG("ret: %d\n", enRet);
PLFAPI_TRACE("out\n");
return enRet;
}
- 4-7
/*!
****************************************************
* @File name 4-7
* @Purpose copy the string as required
* @Author Super Pallet Town Man
* @Data 2022-8-14
****************************************************
*/
#include <stido.h>
#include <stdlib.h>
#define STR_LEN 30
/*!
* @brief spaces are computed recursicely
*
* @param[in] string target string
*
* @return str
*/
char *blankCount(char *str)
{
PLFAPI_TRACE("in\n");
if (NULL == str) //! 入参为指针需要判空
{
PLFAPI_ERR("src is null\n");
goto END;
//PLFAPI_TRACE("out\n");
//return NULL;
}
if(*str == '\0')
{
goto END;
}
if(*str == ' ')
{
str++;
str = blankCount(str);
}
END:
PLFAPI_DBG("str is: %c\n", str);
PLFAPI_TRACE("out\n");
return str;
}
/*!
* @brief palindrome
*
* @param[in] string target string
*
*/
void deBlank(char string[])
{
PLFAPI_TRACE("in\n");
char *strTemp = string;
char str1[STR_LEN]={0};
int i = 0;
if (NULL == string) //这里的入参数组退化为了指针,所以要进行判空操作
{
PLFAPI_ERR("string is null\n");
goto END;
}
while (*strTemp != '\0')
{
if (*strTemp != ' ')
{
str1[i++] = *strTemp;
strTemp++;
}
else
{
str1[i++] = *strTemp;
strTemp++;
strTemp = blankCount(strTemp);
}
}
PLFAPI_MSG("After str1 is: %s\n", str1);
END:
PLFAPI_TRACE("out\n");
return;
}
/*!
* @brief main function
*/
int main(int argc, char *argv[])
{
PLFAPI_TRACE("in\n");
EN_RETURN enRet = EN_OK; //返回值定义与初始化
char str1[STR_LEN] = "aer bui d ff ";
PLFAPI_MSG("Befor str1 is : %s\n", str1);
deBlank(str1);
PLFAPI_DBG("ret: %d\n", enRet);
PLFAPI_TRACE("out\n");
return enRet;
}