《C和指针》第四章编程练习(基于编程规范)

本文详细介绍了C/C++编程的一系列规范,包括代码格式、注释、函数输入输出处理等方面,并提供了四个涉及字符串操作、浮点数平方根计算、文件读取及字符串处理的实例代码,强调了指针安全、内存管理和错误处理的重要性。
摘要由CSDN通过智能技术生成

**

一、规范要求

**
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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值