Coding In C day08

函数
    程序语句可以分组,分组可以一层又一层的进行下去,顶级分组就是函数。函数实现了对程序语句的分组。不同的函数通过函数名区分,函数名有"两个代表",一是代表整个函数所在代码区,二是代表函数所在代码区里的首条语句首地址。

    函数分为函数头和函数体,函数头单独出现叫做函数声明。

    函数中的return;语句主要功能在于立即结束函数的执行,她的附带作用是想主调函数传送一个返回值。也就是说,函数在执行过程中将会在遇到return语句或者遇到函数右大括号时候立即结束函数执行。需要注意的是,当由return语句传送一个返回值时候必须在函数头中指明返回值类型。

注意:    return;//立即停止执行当前函数执行,返回主调函数。
        exit(0);//功能执行比return更强硬,exit();语句立即终止程序执行,将参数返回给操作系统,相当于位于main函数的return语句。exit()函数在头文件stdllib.h里面。

    主调函数的函数调用语句的函数参数称为"实际参数",简称"实参";被调函数函数定义时定义的参数变量称为"形式参数",简称"形参"。C语言实参向形参只进行"值传递"。

    C语言源程序中函数的声明应避免依赖编译器的隐式声明。我们应该在源程序的开头把文件中所有函数的声明都列出来。否则有可能在编译时候导致编译器进行隐式声明,这种声明方式可能引起问题,我们应该在源程序中避免编译器的隐式声明。
/*
 * 函数练习 - 隐式函数声明
 *
 * 以下源程序是可以编译通过的,因为gcc聪明了,当她编译到语句value = add(2, 3)时,自行假定了add函数声明是int add();这叫做"隐式声明"。
 *
 * 正因存在隐式声明int add();所以编译就通过了。但是,若实际的add函数是void add();那么gcc的假定就是错误的,所以编译会报错

 	C语言源程序中函数的声明应避免依赖编译器的隐式声明。我们应该在源程序的开头把文件中所有函数的声明都列出来。否则有可能在编译时候导致编译器进行隐式声明,这种声明方式可能引起问题,我们应该在源程序中避免编译器的隐式声明。
 * */

#include <stdio.h>


void show(int value)
{//output
	printf("计算结果是");
	printf("%d\n", value);

	return ;
}

int main()
{
	int value = 0;
	value = add(2, 3);
	show(value);

	return 0;
}


int add(int value1, int value2)
{//add
	return value1 + value2;
}



/*
 * 函数练习
 * 编辑read函数和show函数,show从键盘读入一个整数,由show函数输出
 * */

#include <stdio.h>

int read();
void show(int);//该语句书写为void show();编译也可以通过,函数声明语句可以供编译器编译本源程序时候使用

int main()
{
	int value = 0;
	value = read();
	show(value);

	return 0;
}

int read()
{
	int value;
	printf("请输入一个整数:");
	while (!scanf("%d", &value)){
		scanf("%*[^\n]");
		scanf("%*c");
		printf("程序未能从输入流中提取到整数,请再次输入一个整数:");
	}
	scanf("%*[^\n]");
	scanf("%*c");
	return value;
}

void show(int value)
{

	//fflush(stdout)可以把输出缓冲区中的所有内容立刻显示在屏幕上
	printf("%d\n", value);

	return ;
}


/*
 * 汉诺塔问题
 * */

#include <stdio.h>

unsigned han_nuo_ta(int value, char a, char b, char c);
main()
{
	int value = 0;
	char a = 'A', b = 'B', c = 'C';
	scanf("%d", &value);
	han_nuo_ta(value, a, b, c);
}

unsigned han_nuo_ta(int value, char a, char b, char c)
{
	static unsigned counter = 0;
	if (value != 1) {
		han_nuo_ta(value - 1, a, c, b);
		printf("第%d步:%d盘子%c -> %c\n", ++counter, value, a, c);
		han_nuo_ta(value - 1, b, a, c);
		return counter;
	}
	else 
	{
		printf("第%d步:%d盘子%c -> %c\n", ++counter, value, a, c);
		return counter;
	}
}
/*
 * 函数练习
 * */

#include <stdio.h>

void func()
{
	printf("abc\n");
	//return;//立即停止执行当前函数执行,返回主调函数。
	//exit(0);//功能执行比return更强硬,exit();语句立即终止程序执行,将参数返回给操作系统,相当于位于main函数的return语句。exit()函数在头文件stdllib.h里面。
	printf("def\n");

	return ;
}

int main()
{
	func();
	printf("xyz\n");

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C和C++的安全编码是指在编写C和C++代码时,采取一系列的措施来确保代码的安全性和防止常见的安全漏洞。由于C和C++是底层的编程语言,它们允许对内存直接进行操作,这也使得它们容易受到各种安全威胁的攻击。 在进行安全编码时,有几个关键的原则需要遵循。首先是验证输入。由于输入数据往往是来自外部,我们需要对输入进行验证,以确保它们符合预期的格式和范围。这样可以防止缓冲区溢出和格式化字符串漏洞等攻击。 其次,应该正确地管理内存。C和C++允许直接控制内存的分配和释放,但这也意味着需要手动管理内存的生命周期。如果没有正确地分配和释放内存,会导致内存泄漏和非法内存访问等问题。因此,务必要仔细检查并指定正确的内存操作。 此外,还应注意避免使用不安全的函数和功能。一些函数和功能可能存在安全风险,如strcpy和scanf等。应该使用更安全的替代函数,如strncpy和fgets等,以提高代码的安全性。 最后,代码的安全性也需要经过不断的测试和审查。通过进行静态代码分析和动态测试,可以发现和纠正代码中的潜在安全问题。此外,代码审查也是非常重要的,通过互相审查可以找到潜在的漏洞和错误。 总而言之,C和C++的安全编码需要遵循验证输入、正确管理内存、避免使用不安全函数和功能以及进行测试和审查等原则。只有通过采取适当的安全措施,才能确保代码的安全性并防止潜在的安全漏洞。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值