- 这里是C语言程序的一些实现源码,希望可以对您的编程有一些帮助。
- 由于内容比较多,就不一一划分了,需要的朋友可以根据下面的.h文件和程序里面的注释慢慢查找自己需要的部分内容。
01-.h文件
#include <stdio.h>
/// 打印输出*_01
void high_quality_print_star_01(int n);
/// 打印输出*_02
void high_quality_print_star_02(int n);
/// 基本库函数的使用
void high_quality_uses_of_basic_library_functions(void);
/// 质数_01
void high_quality_prime_numbers_01(int num);
/// 质数_02
void high_quality_prime_numbers_02(int num);
/// 质数_03
void high_quality_prime_numbers_03(void);
/// 输入一个整数,判断它是几位数
void high_quality_determine_digits(void);
/// 猜数赢大奖
void high_quality_guess_number(void);
/// 下一秒
void high_quality_next_second(void);
/// 字符排序
void high_quality_sorted_character(void);
/// 水仙花数
void high_quality_daffodi_number(void);
/// 输入输出区间数
void high_quality_inout_interval_number(void);
/// 计算字符个数
void high_quality_calculate_number_characters(void);
/// 求最大公约数_01
void high_quality_greatest_common_divisor_01(void);
/// 求最大公约数_02
void high_quality_greatest_common_divisor_02(void);
/// 求最小公倍数
void high_quality_least_common_multiple(void);
/// 分解质因数
void high_quality_prime_factors(void);
/// 求回文数
void high_quality_palindrome(void);
/// 输入学生年龄,求平均年龄和年龄总和
void high_quality_average_age(void);
/// 学生成绩的查找
void high_quality_student_achievement_to_find(void);
/// 数组元素的输入与输出
void high_quality_in_output_array_elements(void);
/// 逆序输出数组元素
void high_quality_reverse_output_array_elements(void);
/// 字符输入输出处理
void high_quality_character_input_or_output_processing(void);
/// 大小写字符统计
void high_quality_case_character_statistics(void);
/// 数组的最值与下标_01
void high_quality_most_value_and_subscript_arrays_01(void);
/// 数组的最值与下标_02
void high_quality_most_value_and_subscript_arrays_02(void);
/// 数组排序_01
void high_quality_sort_array_01(void);
/// 数组排序_02
void high_quality_sort_array_02(void);
/// 输入任意多数求最值
void high_quality_enter_any_most_get_most_value(void);
/// 输入一个数逆序
void high_quality_enter_number_reverse_order(void);
/// F1加F2问题
void high_quality_f1_f2_problem(void);
/// 二维数组的输出与最值
void high_quality_output_dimensional_array_and_most_value(void);
/// 递归函数
int high_quality_f(int n);
/// 选择排序
void high_quality_selection_sort(void);
/// 冒泡排序
void high_quality_bubble_sort(void);
/// 输入指定元素个数求最值
void high_quality_most_value_input_number_elements(void);
/// 字符逆序输出_01
void high_quality_reverse_output_characters_01(void);
/// 字符逆序输出_02
void high_quality_reverse_output_characters_02(void);
/// 函数实现排序
void high_quality_sort_array_fuction(void);
/// 从终端输入字符串进行拷贝_01
void high_quality_input_string_to_copy_from_terminal_01(void);
/// 从终端输入字符串进行拷贝_02
void high_quality_input_string_to_copy_from_terminal_02(void);
/// 查找字串_01
void high_quality_find_string_01(void);
/// 查找字串_02
void high_quality_find_string_02(void);
/// 账号密码登录
void high_quality_login_with_account_and_password(void);
/// 字符串链接
void high_quality_string_link(void);
/// 求字符串长度
int high_quality_string_length(char *p);
/// 字符串拷贝
void high_quality_string_copy(void);
/// 字符串比较
void high_quality_string_comparison(void);
02-.c文件
#include <stdlib.h>
#include <math.h>
#include <string.h>
void high_quality_print_line(void) {
printf("------------------------------\n");
}
#pragma mark --- 打印输出*_01
void high_quality_print_star_01(int n) {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < i; j++) {
printf(" ");
}
for (j = 0; j < n - i; j++) {
printf("*");
}
printf("\n");
}
}
#pragma mark --- 打印输出*_02
void high_quality_print_star_02(int n) {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < (n - 1) - i; j++) {
printf(" ");
}
for (j = 0; j <= i; j++) {
printf("*");
}
printf("\n");
}
}
#pragma mark --- 基本库函数的使用
void high_quality_uses_of_basic_library_functions(void) {
int a = -5;
printf("a:%d\n",abs(a));
int student = arc4random()%50 + 1;
printf("student:%i\n",student);
double di = 12.0,zhi = 2;
double pf = pow(di, zhi);
printf("pf:%f\n",pf);
double value = 144.0;
double gen = sqrt(value);
printf("gen:%f\n",gen);
}
#pragma mark --- 质数_01
void high_quality_prime_numbers_01(int num) {
int i = 2, j;
while(i <= num) {
j = 2; //每次初始为2
while(j < i) {
if(i % j == 0) {
break;
}
j++;
}
if(i == j) {
printf("%d是质数\n",i);
}
i++;
}
}
#pragma mark --- 质数_02
void high_quality_prime_numbers_02(int num) {
int i, j;
for(i = 2; i <= num; i++) {
for(j = 2; j < i; j++) { // 第2个循环,判断2到100的数从2开始整除,看能否找到公约数
if(i % j == 0) { // 如果是找到了除1和本身外的其他公约数,直接退出
break;
}
}
if(i == j) { // 如果找到的公约数只有自己
printf("%d是质数\n",i);
}
}
}
#pragma mark --- 质数_03
void high_quality_prime_numbers_03(void) {
int m, n, i, j;
printf("请输入一个范围,m到n: \n");
scanf("%d%d",&m,&n);
high_quality_print_line();
for(i = m; i <= n; i++) {
for(j = 2; j < i; j++) {
if( i% j == 0) { // 找到公约数,不是质数
break;
}
}
if(i == j) { // 第2个循环一直到最后都没找到公约数,也就是没有进入到break,那么是质数
printf("%d是质数\n", i);
}
}
}
#pragma mark --- 输入一个整数,判断它是几位数
void high_quality_determine_digits(void) {
int n, index = 0;
printf("请输入一个整数:\n");
scanf("%d",&n);
high_quality_print_line();
while(n > 0) {
index++; // 判断位数
n /= 10; // 判断位数后数据少一位
}
printf("位数是%d\n",index);
}
#pragma mark --- 猜数赢大奖
void high_quality_guess_number(void) {
int daan = arc4random() % 1000 + 1;
int num, max = 1000, min = 1;
do {
printf("请输入一个(%d~%d)的中奖号码:", min, max);
scanf("%d",&num);
if(num > max || num < min) { // 如果你输入的数不在系统设置的范围,重新输入
printf("你短路啦\n");
continue; // 跳出当次循环,不影响下一次循环的执行
}
if(num > daan) {
max = num;
printf("大了\n");
} else if(num < daan) {
min = num;
printf("小了\n");
}
} while(num != daan);
printf("恭喜你,中大奖,记得请吃饭喔!\n");
}
#pragma mark --- 下一秒
void high_quality_next_second(void) {
int h, m, s;
printf("请输入时、分、秒(输入样式为10:55:12):\n");
scanf("%d:%d:%d", &h, &m, &s);
high_quality_print_line();
if (h > 24 || m > 60 || s > 60) {
printf("请输入正确的时间\n");
return;
}
s++; // 先求秒+1
if(s == 60) // 如果秒钟正好为60
{
s = 0; // 秒钟附值为0
m += 1; // 分钟要加1
if(m == 60) // 判断如果分钟为60
{
m = 0; // 分钟附值为0
h++; // 小时+1
if(h == 24) // 如果小时=24
{
h = 0; // 回到凌晨
}
}
}
printf("下一秒为: %02d:%02d:%02d\n", h, m, s);
}
#pragma mark --- 字符排序
void high_quality_sorted_character(void) {
int i, j, num;
char ch;
printf("请输入一个范围在1~26内的整数:\n");
scanf("%d",&num);
high_quality_print_line();
if (num > 26) {
printf("请重新输入\n");
return;
}
for(i = 0; i < num; i++) {
ch = 'A'; // 注意这行必须放在这里,用于,打印行时,每次从A开始
for(j = 0;j <= i; j++) {
printf("%c",ch++);
}
printf("\n");
}
}
#pragma mark --- 水仙花数
void high_quality_daffodi_number(void) {
int i, bai, shi, ge, sum;
for(i = 100; i <= 999; i++) {
bai = i / 100; // 求出百位数
shi = i / 10 % 10; // 求出十位数
ge = i % 10; // 求出个位数
sum = bai*bai*bai + shi*shi*shi + ge*ge*ge;
if(sum == i) {
printf("%d是水仙花数\n",i);
}
}
}
#pragma mark --- 输入输出区间数
void high_quality_inout_interval_number(void) {
int num1, num2, i;
printf("请输入两个整数:\n");
scanf("%d%d",&num1,&num2);
high_quality_print_line();
int max = num1 > num2 ? num1 : num2;
int min = num1 < num2 ? num1 : num2;
for(i = min; i <= max; i++) {
printf("%d ",i);
}
printf("\n");
}
#pragma mark --- 计算字符个数
void high_quality_calculate_number_characters(void) {
char ch;
int zimu = 0, num = 0, spc = 0, other = 0;
printf("请输入一系列字符:\n");
while(1) {
scanf("%c", &ch);
if(ch == '\n') {
break;
} else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
zimu++;
} else if (ch >= '0' && ch <= '9') {
num++;
} else if (ch == ' ') {
spc++;
} else {
other++;
}
}
printf("字母个数:%d,数字个数:%d,空格个数:%d,其他个数:%d\n", zimu, num, spc, other);
}
#pragma mark --- 求最大公约数_01
void high_quality_greatest_common_divisor_01(void) {
int num1, num2;
printf("请输入两个整数:\n");
scanf("%d%d", &num1, &num2);
int max = num1 > num2 ? num1 : num2; // 条件运算符,关键在于找关系
int min = num1 < num2 ? num1 : num2;
int i; // 假设我输入的两个数min=30, max=60
for(i = min; i >= 2; i--) // 从min开始,也就是最大公约数的最大取值为min
{
if(min % i == 0 && max % i == 0) // 假设max能整除,min也能整除,则这个值就是最大公约数
{
break;
}
}
printf("最大公约数为:%d\n",i);
}
#pragma mark --- 求最大公约数_02
void high_quality_greatest_common_divisor_02(void) {
int num1, num2, gongyue = 1;
printf("请输入两个整数:\n");
scanf("%d%d", &num1, &num2);
int i;
for(i = 2; i <= (num1 < num2 ? num1 : num2); i++) // 条件表达式放入关系判断中,目的就是一直变
{
if(num1 % i == 0 && num2 % i == 0) // 假设找到一个公约数,进入判断语句中
{
gongyue *= i; // 找到后,公约数提取
num1 /= i; // 提取后去除该公约数,
num2 /= i; // 提取后去除该公约数
i--; // 目的是从当前数开始,继续去循环查找公约数
}
}
printf("最大公约数为:%d\n",gongyue);
}
#pragma mark --- 求最小公倍数
void high_quality_least_common_multiple(void) {
int num1, num2, i, gongbei = 0;
printf("请输入两个整数:\n");
scanf("%d%d", &num1, &num2);
int max = num1 > num2 ? num1 : num2;
int min = num1 < num2 ? num1 : num2;
for(i = max; i <= min * max; i++) // 从最大值开始一直到两数的乘积,这个范围就是最小公倍数的范围
{
if(i % max == 0 && i % min == 0) // 如果能够找到一个能整除两个数的数,则为最小公倍数
{
gongbei = i; // 取到最小公倍数,退出
break;
}
}
printf("最小公倍数为%d\n",gongbei);
}
#pragma mark --- 分解质因数
void high_quality_prime_factors(void) {
int num;
printf("请输入一个整数:\n");
scanf("%d", &num);
int i;
high_quality_print_line();
printf("%d = ", num);
for(i = 2; i < num; i++) // 假设num=6
{
if(num % i == 0) // 6%2,成立,那么说明2为6的质因数
{
printf("%d * ", i);
num /= i; // 6/2==3,找到一个质因数,然后除去质因数,继续找
i--; // 找到一个质因数后,还是从当前数开始找质因数,而不是从下一次开始找
}
}
printf("%d\n", i); // 打印最后一个质因数
}
#pragma mark --- 求回文数
void high_quality_palindrome(void) {
int i, ge, shi, qian, wan;
for(i = 10000; i <= 99999; i++) {
ge = i % 10; // 12345%10 = 5
shi = i % 100 / 10; // 12345%100 = 45/10 = 4
qian = i / 1000 % 10; // 12345/1000 = 12%10 = 2
wan = i / 10000; // 12345/10000 = 1
if(ge == wan && shi == qian) {
printf("%d是回文数\n",i);
}
}
}
#pragma mark --- 输入学生年龄,求平均年龄和年龄总和
void high_quality_average_age(void) {
int a[5], sum = 0;
float avg;
printf("请输入5个学生的年龄信息:\n");
int i;
for(i = 0; i < 5; i++) {
scanf("%d",&a[i]);
}
high_quality_print_line();
for(i = 0; i < 5; i++) {
printf("%d ", a[i]); // 循环打印数组元素
sum += a[i];
}
avg = (float)sum/5; // 记住:(float)(sum/5)则是整体取整再强转
printf("\nsum = %d\navg = %g\n", sum, avg); // 求和与求平均值
}
#pragma mark --- 学生成绩的查找
void high_quality_student_achievement_to_find(void) {
int score[6] = {98, 67, 82, 60, 68, 77};
int i, num, flag = -1; // flog=-1为一个标记
for(i = 0; i < 6; i++) {
printf("%d ",score[i]);
}
printf("\n请输入一个数:\n");
scanf("%d",&num);
for(i = 0; i < 6; i++) {
if(num == score[i]) // 判断有没有找到匹配的成绩
{
flag = i; // 找到了,进行标记
break;
}
}
if(flag == -1) // 如果这个标记值没有被改变
{
printf("没有找到学生的成绩\n");
} else {
printf("第%d名学生的成绩为:%d\n", flag+1, num);
}
}
#pragma mark --- 数组元素的输入与输出
void high_quality_in_output_array_elements(void) {
int a[10] = {};
int i = 0, len = 0;
printf("请输入10个以内的数组元素:\n");
for(i = 0; i < 10; i++) {
scanf("%d", &a[i]);
len++;
if(getchar() == '\n') // 获取字符,如果为回车,跳出循环
{
break;
}
}
high_quality_print_line();
for(i = 0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
#pragma mark --- 逆序输出数组元素
void high_quality_reverse_output_array_elements(void) {
int a[10] = {};
int i, len = 0, t;
printf("请输入10个内的不定长元素:\n");
for(i = 0; i < 10; i++) // 第一个for求不定长
{
scanf("%d", &a[i]);
len++;
if(getchar() == '\n') // getchar()为获取字符的函数
{
break;
}
}
//逆序,交换元素
for(i = 0; i < len / 2; i++) // 交换一半次数,否则还原了
{
t = a[i]; // 数组的首位元素交换
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
printf("逆序后:");
for(i = 0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
#pragma mark --- 字符输入输出处理
void high_quality_character_input_or_output_processing(void) {
char a[30] = {};
printf("请输入一系列字符:\n");
int i, len = 0;
for(i = 0; i < 30; i++) {
scanf("%c", &a[i]);
if(a[i] == '\n') // 一个一个字符输出,若判断为‘\n’则退出
{
break;
}
len++; // 获取到不定长度
}
for(i = 0; i < len; i++) // 在不定长数组中遍历元素
{
if(a[i] >= 'A' && a[i] <= 'Z') {
a[i] += 32; // 大写转小写
}
printf("%c",a[i]);
}
printf("\n");
}
#pragma mark --- 大小写字符统计
void high_quality_case_character_statistics(void) {
char a[30] = {};
printf("请输入一系列字符(30个字符以内):\n");
int i, small = 0, big = 0;
for(i = 0; i < 30; i++) {
scanf("%c", &a[i]);
if(a[i] == '\n') // 一个一个字符输出,若判断为‘\n’则退出
{
break;
} else if (a[i] >= 'a' && a[i] <= 'z') {
small++;
} else if (a[i] >= 'A' && a[i] <='Z') {
big++;
}
}
printf("大写字母:%d个,小写字母:%d个\n",big,small);
}
#pragma mark --- 数组的最值与下标_01
void high_quality_most_value_and_subscript_arrays_01(void) {
int a[] = {50, 70, 80, 49, 55, 111, 23, 34, 90};
int len = sizeof(a) / sizeof(int); // 习惯使用求长度的方法
int i, index = 0; // 假设最大值元素的下标是0
int max = a[0]; // 假设第一个元素就是最大值
for(i = 0; i < len; i++) {
printf("%d ", a[i]);
if(max < a[i]) // 遍历数组,然后判断最大值,如果比指定最大值大
{
index = i; // 记录最大值的下标
max = a[i]; // 把最大值附值给指定的max
}
}
printf("\n最大值为%d,下标为%d\n", max, index);
}
#pragma mark --- 数组的最值与下标_02
void high_quality_most_value_and_subscript_arrays_02(void) {
int a[6] = {};
int len = sizeof(a) / sizeof(int);
printf("请输入6个整数:\n");
int i;
for(i = 0; i < len; i++) {
scanf("%d", &a[i]);
}
high_quality_print_line();
int min = a[0];
int index = 0;
for(i = 1; i < len; i++) {
if(min > a[i]) {
min = a[i];
index = i;
}
}
printf("最小值为:%d,下标为:%d\n", min, index);
}
#pragma mark --- 数组排序_01
void high_quality_sort_array_01(void) {
int a[] = {67, 90, 78, 80, 89, 98};
int i, j, min, index, t;
int len = sizeof(a) / sizeof(int); // 求元素个数
for(i = 0; i < len - 1; i++) // 循环比较次数
{
min = a[i]; // 第一次假设第1个值为最小,依此类推
index = i; // 第一次假设下标0为最小,依此类推
for(j = i + 1; j < len; j++) // 第一次比较时,与第二个位置值开始比较,一直比较到后面
{
if(min > a[j]) // 判断有比假设的值最小,把该元素设置为最小值
{
min = a[j]; // 最小值附值给min,
index = j; // 记录最小下标值
}
}
t = a[i]; // 交换假设最小元素值与找到的最小元素值
a[i] = a[index];
a[index] = t;
}
for(i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
#pragma mark --- #pragma mark --- 数组排序_02
void high_quality_sort_array_02(void) {
int a[] = {98, 90, 67, 78, 80, 89};
int len = sizeof(a) / sizeof(int);
int i, j, t;
for(i = 0; i < len - 1; i++) // 比较len-1次
{
for(j = 0; j < len - i - 1; j++) // len-i-1,如果不-1的话,会溢出
{
if(a[j] > a[j + 1]) // 如果第一个元素与第二个元素大,交换,永远保证右边的大
{
t = a[j]; // 交换比较后的第一个元素与第二个元素
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for(i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
#pragma mark --- 输入任意多数求最值
void high_quality_enter_any_most_get_most_value(void) {
int max = 0, num;
printf("请输入任意多数(输入0结束):\n");
scanf("%d", &num);
while(num != 0) {
max = max > num ? max : num; // 求最大值
scanf("%d", &num); // 循环输入
}
printf("最大值为:%d\n", max);
}
#pragma mark --- 输入一个数逆序
void high_quality_enter_number_reverse_order(void) {
int num;
printf("请输入一个数:\n");
scanf("%d", &num);
while(num) {
printf("%d", num % 10); // 求出个位数
num /= 10; // 把十位数变位个位数,循环判断是否为0
}
printf("\n");
}
#pragma mark --- F1加F2问题
void high_quality_f1_f2_problem(void) {
int num, a = 1, b = 1, c = 0;
printf("请输入一个数:\n");
scanf("%d", &num);
int i;
for(i = 1; i <= num; i++) {
if(i == 1 || i == 2) {
printf("%d ",a);
} else {
c = a + b; // 求出第三项值=第一项+第二项
printf("%d ",c);
a = b; // 为循环做准备,当前第2项附给下一次的第1项
b = c; // 当前第3项,附给下一次的第2项
}
}
printf("\n");
}
#pragma mark --- 二维数组的输出与最值
void high_quality_output_dimensional_array_and_most_value(void) {
int a[3][3] = {2, 5, 4, 3, 6, 4, 7};
int i,j;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
int max = a[0][0];
int row = 0;
int col = 0;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
if(max < a[i][j]) {
max = a[i][j];
row = i;
col = j;
}
}
}
printf("\n最大值为:%d,该行下标为:%d,列下标为:%d\n", a[row][col], row, col);
}
#pragma mark --- 递归函数
int high_quality_f(int n) {
if(n == 1) {
return 1;
} else {
return high_quality_f(n - 1) * n;
}
}
#pragma mark --- 选择排序
void high_quality_selection_sort(void) {
char a[] = {'a', 's', 'd', 'f', 'g'};
int len = sizeof(a) / sizeof(char);
int min;
int index;
int i, j, t;
for(i = 0; i < len - 1; i++) // 判断len-1次
{
min = a[i]; // 第一次假设第一个元素为最小,依此类推
index = i; // 第一次假设下标值0为最小元素,依此类推
for(j = i + 1; j < len; j++) // 每一次将最小值与后面的元素做比较
{
if(min > a[j]) // 如果遍历时,有元素比定义值还小,将该元素值附给min
{
min = a[j]; // 将最小元素附给min
index = j; // 记录最小值的下标
}
}
t = a[i]; // 交换假设最小元素值与找到的最小下标值
a[i] = a[index];
a[index] = t;
}
for(i = 0; i < len; i++)
{
printf("%c ", a[i]);
}
printf("\n");
}
#pragma mark --- 冒泡排序
void high_quality_bubble_sort(void) {
//冒泡排序
char a[] = {'a', 's', 'd', 'f', 'g'};
int len = sizeof(a) / sizeof(char);
int i, j, t;
for(i = 0; i < len - 1; i++) // 比较len-1次
{
for(j = 0; j < len - i - 1; j++) // 记住:len-i-1,一定要-1,否则溢出
{
if(a[j] > a[j + 1]) // 最大值永远在右边,如果不在,交换
{
t = a[j]; // 交换相邻两个数的值
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for(i = 0; i < len; i++) {
printf("%c ",a[i]);
}
printf("\n");
}
#pragma mark --- 输入指定元素个数求最值
void high_quality_most_value_input_number_elements(void) {
int a[10] = {};
printf("请输入10个元素:\n");
int i;
for(i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
high_quality_print_line();
int max = a[0]; // 假设第一个元素为最大
int index = 0; // 假设最大值的下标是0
for(i = 0; i < 10; i++) {
if(max < a[i]) // 判断如果遍历数组元素能找到比max要大
{
max = a[i]; // 把最大值附给max
index = i; // 记录下标
}
}
printf("数组的最大值为:%d,下标为:%d\n", max, index);
}
#pragma mark --- 字符逆序输出_01
void high_quality_reverse_output_characters_01(void) {
char a[10] = {};
int len = sizeof(a) / sizeof(char);
int i, t;
printf("请输入10个字符,以空格隔开:\n");
for(i = 0; i < len; i++) //输入10个字符
{
scanf("%c", &a[i]);
getchar(); //读取1个字符
}
high_quality_print_line();
for(i = 0; i < len / 2; i++) //交换元素
{
t = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
for(i = 0; i < len; i++) {
printf("%c ", a[i]);
}
printf("\n");
}
#pragma mark --- 字符逆序输出_02
void high_quality_reverse(char *p, long len) {
int i, t;
for(i = 0; i < len / 2; i++) // 通过指针指向数组实现逆序交换
{
t = p[i]; // 指针的逆序相当于是实参a的逆序
p[i] = p[len - i - 1];
p[len - i - 1] = t;
}
}
void high_quality_printArr(char *p, long len) {
int i;
printf("逆序后:");
for(i = 0; i < len; i++) {
printf("%c", p[i]);
}
printf("\n");
}
void high_quality_reverse_output_characters_02(void) {
char s[] = "zhang san li si";
long len = strlen(s);
printf("逆序前:%s\n", s);
high_quality_print_line();
high_quality_reverse(s, len);
high_quality_printArr(s, len);
}
#pragma mark --- 函数实现排序
void high_quality_sort_array(char p[], long len) {
long i, j, t;
for(i = 0; i < len - 1; i++) {
for(j = 0; j < len - i - 1; j++) {
if(p[j] > p[j + 1]) {
t = p[j];
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
}
void high_quality_print_array(char p[], long len) {
long i;
printf("排序后:");
for(i = 0; i < len; i++) {
printf("%c ", p[i]);
}
printf("\n");
}
void high_quality_sort_array_fuction(void) {
char s[] = "fbacdz";
long len = sizeof(s) / sizeof(char);
printf("排序前:%s\n", s);
high_quality_print_line();
high_quality_sort_array(s, len);
high_quality_print_array(s, len);
}
#pragma mark --- 从终端输入字符串进行拷贝_01
void high_quality_input_string_to_copy_from_terminal_01(void) {
char str1[30] = {};
char str2[30] = {};
printf("从终端输入字符串:\n");
scanf("%[^\n]", str2);
long len = strlen(str2);
if (len > 30) {
printf("不要超过30个字符\n");
return;
}
high_quality_print_line();
strcpy(str1, str2); //带着‘\0’一起拷贝
printf("copy后:%s\n", str1);
}
#pragma mark --- 从终端输入字符串进行拷贝_02
void high_quality_input_string_to_copy_from_terminal_02(void) {
char str1[50] = {};
char str2[50] = {};
int n;
printf("请输入字符串:\n");
scanf("%[^\n]", str2);
long len = strlen(str2);
if (len > 50) {
printf("不要超过50个字符\n");
return;
}
printf("请输入要拷贝的字符串个数:\n");
scanf("%d", &n);
high_quality_print_line();
strncpy(str1, str2, n); // 拷贝个数后面不加‘\0’
str1[n] = '\0'; //最后一位手动‘\0’
printf("%s\n", str1);
}
#pragma mark --- 查找字串_01
void high_quality_find_string_01(void) {
char a[] = "when i was young";
char b[10];
printf("%s\n请输入一个子串:\n", a);
scanf("%s", b);
// char *p = strstr(a, b); // 在字符串中查找子串函数,区分大小写
char *p = strcasestr(a, b); // 在字符串中查找子串函数,不区分大小写
if(p) {
printf("%s\n", p);
} else {
printf("没找到\n");
}
}
#pragma mark --- 查找字串_02
void high_quality_find_string_02(void) {
char a[] = "ababadabababc";
char b[] = "aba";
char *p = strstr(a, b); // 查找子串,如果找到返回找到子串的地址
int index = 0;
while(p) // 如果找到了,进入循环
{
index++; // 记录找到次数
p++; // 找到一次后,字符串偏移一位
p = strstr(p, b); // 再在偏移后的字符串中找子串
}
printf("%s出现的次数为:%d\n", b, index);
}
#pragma mark --- 账号密码登录
void high_quality_login_with_account_and_password(void) {
char *user = "xiaoqiang";
char *pass = "123";
char us[40] = {};
char pa[40] = {};
printf("输入用户名:");
scanf("%[^\n]",us);
getchar();
printf("输入密码:");
scanf("%[^\n]",pa);
int userVal = strcmp(user, us); // 从前往后,比较字符串的ascii值
int passVal = strcmp(pass, pa); // 如果ascii值相同返回0,不同返回比较字符的差值
if(userVal ==0 && passVal == 0) {
printf("登录成功\n");
} else {
printf("用户名或密码错误,userVal = %d, passVal = %d\n", userVal, passVal);
}
}
#pragma mark --- 字符串链接
void high_quality_string_link(void) {
char a[50] = "xiaoqiang";
char b[] = " nihao!";
strcat(a, b); // 链接后,原始a中的‘\0’变为‘ ’,注意字符串a必须要由足够空间存放链接后的字符串
printf("%s\n", a);
}
#pragma mark --- 求字符串长度
int high_quality_string_length(char *p) {
int index = 0;
while(*p != '\0') // 判断元素值是否为‘\0’,*p从首元素开始
{
index++; // 判断一个,记录一个字符的个数
p++; // 判断完一个偏移一位地址
}
return index;
}
#pragma mark --- 字符串拷贝
char *stringCopy(char *dst,char *src) {
char *tmp = dst; // 先记录指针的首地址
while(*src != '\0') // 判断指针的取值不为‘\0’,进入循环
{
*dst = *src; // 将指针的取值附值给另一个数组,第一次循环就把第一个元素值附值给另一个数组;
src++; // 原指针偏移一位
dst++; // 目标指针偏移一位
}
*dst = '\0'; // 目标指针的最后一位为‘\0’
return tmp; // 虽然dst偏移走了,但tmp仍然指向首元素地址
// printf("dst = %s\n", dst); // 指针已经偏移到指向‘\0’的地址
}
void high_quality_string_copy(void) {
char a[]="hello world";
char b[20];
char *p = stringCopy(b,a);
printf("p = %s\n", p);
}
#pragma mark --- 字符串比较
int stringComparison(char *p, char *q) {
while(*p != '\0' && *q != '\0') {
if(*p == *q) //判断指针指向的元素,如果相等,则q、q要移动一位再比
{
p++; //指针偏移一位
q++; //指针偏移一位
} else {
return *p - *q; //如果不相等,则返回不相等的ascii值
}
}
return *p - *q; //字符串比较结束后,返回
}
void high_quality_string_comparison(void) {
char a[] = "hello";
char b[20];
printf("%s\n请输入字符串:", a);
scanf("%s", b);
high_quality_print_line();
int val = stringComparison(a, b);
if(val == 0) {
printf("字符串相同\n");
} else {
printf("字符串不相同,val = %d\n", val);
}
}
网友评论