*声明:文中给出的代码 往往 并非最佳解决方案,源于个人学习,仅供学习交流、抛砖引玉之用,请读者宽容看待,多多思考、多多突破。
*注:如遇安全性错误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 库函数 – 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语言的学习相对的难点,也是实现各种强大功能实现的必要工具,其概念较为简单,多多编写、勤加练习可以帮助我们巩固掌握这方面的知识,促进灵活运用。