[C]指针入门案例(+gets/gets_s/fgets个人笔记)

文章介绍了C语言中安全性问题,如C4996警告,建议使用gets_s和fgets替代gets函数。提供了三个代码示例,分别涉及指针用于两数比较、回文判断和随机点名。强调指针是C语言的关键,通过实践能更好地掌握其用法。
摘要由CSDN通过智能技术生成

*声明:文中给出的代码 往往 并非最佳解决方案,源于个人学习,仅供学习交流、抛砖引玉之用,请读者宽容看待,多多思考、多多突破。

*注:如遇安全性错误C4996可添加此行代码于文件头:#pragma warning(disable :4996)。

新版C标准库中gets函数应替换为 gets_s 或 可用fgets,相关简介如下:

---gets_s(存储位置, 读取位数)读取到\n时在其后停止,并将\n替换为\0。(又因为字符串后必须接\0,所以只能读取  定义的位数-1位,最后一位要留给\n用来换成\0。超了可能会报错)

---fgets(存储位置, 读取位数 , stdin):读到\n时在其后停止并将\n录入作为一位再在下一位添加\0 , 或  读满  定义的读取位数-1位  自动停止再把最后一位赋值为\0。(超过  定义的读取位数-1位  则会将多余的输入遗留在输入流中。)*例:定义的读取位数为101,则只读100位,第101位被赋为\0,若输入流中有101位(最后一位是\n或其他),则第101位(\n或其他)将遗留在输入流中。

一、函数、类型 介绍 参考(相关权益归原作者所有):

C 指针 | 菜鸟教程 (runoob.com)

C 库函数 – gets() | 菜鸟教程 (runoob.com)

C 库函数 – fgets() | 菜鸟教程 (runoob.com)

C语言的字符串输入函数gets_s()_gets_s函数怎么用_Galaxy_Robot的博客-CSDN博客

二、案例解决方案代码分享:

1、不变原数两数比大小(指针)

#include<stdio.h>

int main()
{
	int a, b, * p = &a, * q = &b, * z = NULL; //各变量初始化
	printf("输入两个整数来排序(形式:a,b 全英文)\n");
	scanf("%d,%d", &a, &b); //scanf中两输入数间有符号,为保证赋值正确,输入时就要加符号
	a > b ? z = p, p = q, q = z : NULL; //三目运算
	printf("从小到大结果是:%d,%d\na=%d,b=%d\n", *p, *q, a, b); //仅仅变换了指针,没有变两int变量的赋值
	return 0;
}

2、回文的判断

#include <stdio.h>

int Palindrome(char str[])
{//数组的传递是传递第一个元素的地址,也可看作指向数组第一个元素的指针,不是值传递,所以最后数组会被改变,不用传回
	int i;
	char* p = str, * q = NULL; //确定两指针并初始化
	for (i = 0;; i++) { //计总字母个数数
		if (str[i] == '\0') //\0为字符串的结束符,在字符串最后
			break;
	}
	q = &str[i - 1]; //将q指针指向最后一个字母
	for (int j = 0; j < i; j++) {
		if (*p != *q) //比较第一位和最后一位的内容并以此类推
			return 0; //有不同就返回0,否则返回1。
		p++;
		q--;
	}
	return 1;
}
int main()
{
	char str[100];
	printf("请输入字符串,看看是不是回文吧?(不超过100位)\n");
	gets(str); //gets一次性读入一行字符串,遇到换行或文件末尾结束,会自动抛弃换行符
	if (Palindrome(str))
		printf("这是回文。\n");
	else
		printf("这不是回文。\n");
	return 0;
}

3、随机点名

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int NUM;
int RandomNUM(int list[])
{//数组的传递是传递第一个元素的地址,也可看作指向数组第一个元素的指针,不是值传递,所以最后数组会被改变,不用传回
	int random;
	srand((unsigned)time(NULL));
	do {
		random = rand() % NUM + 1; //保证随机的学号在给定人数区间内1-NUM
	} while (list[random - 1] != 0); //避免重复点名
	return (random);
}
void Tongj(int list[])
{
	for (int i = 0; i++ < NUM;) {
		if (!list[i - 1])
			continue; //是0就跳过重新i++并判断
		printf("%d\t", i); //输出统计
		list[i - 1] == 1 ? printf("到\n") : printf("缺\n"); //三目运算符
	}
}
int main()
{
	int list[1000] = { 0 }, named = 0, random;
	printf("请输入班级人数(1000人及以下)\t");
	scanf("%d", &NUM); //获取总人数
	do {
		random = RandomNUM(list);
		printf("请%d号同学报道!(1-到,2-没到,3-停止点名,输入其他重新随机)\n", random);
		rewind(stdin);
		switch (getchar()) {
		case '1':list[random - 1] = 1; break;
		case '2':list[random - 1] = 2; break;
		case '3':continue; //continue可以跳过下面的if统计,直接到while的判断,由于到/缺必然被赋值,所以不赋值看作直接结束用于while判断
		default:random = 0; continue; //由于定义的RandomNUM函数取random时不会为0,此处借用来当while的判断符
		}
		if (++named == NUM) { //统计已点人数
			printf("已全部点完\n");
			Tongj(list); //输出统计结果
			return 0;
		}
	} while (list[random - 1] != 0 || random == 0);
	Tongj(list); //输出统计结果
	return 0;
}

总结:

指针是C语言的学习相对的难点,也是实现各种强大功能实现的必要工具,其概念较为简单,多多编写、勤加练习可以帮助我们巩固掌握这方面的知识,促进灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值