首页
动态
归档
Github
留言
工具箱
更多
邻居
壁纸
音乐
Search
1
欢迎访问我的日志空间
8,244 阅读
2
C语言读写程序文件-学习三十二
742 阅读
3
WEB音乐播放器源码
712 阅读
4
Typecho - Joe主题魔改版(持续更新)
660 阅读
5
Typecho-1.1/17.10.30-定制版源码
639 阅读
学习笔记
源码库
BUG
第九艺术
登录
Search
标签搜索
学习笔记
C语言
typecho
Java
扫雷
源码
PHP
插件
网站源码
音乐播放器
模板
git
github
bug
XG.孤梦
累计撰写
50
篇文章
累计收到
44
条评论
首页
栏目
学习笔记
源码库
BUG
第九艺术
页面
动态
归档
Github
留言
工具箱
邻居
壁纸
音乐
搜索到
50
篇与
的结果
2022-02-12
C语言函数嵌套与递归调用-学习十八
函数的嵌套调用C语言的函数定义是互相平行、独立的即函数不能嵌套定义,但可以嵌套调用函数。即调用一个函数的过程中,又可以调用另一个函数。上图表示了两层嵌套的情形。其执行过程是:1.执行 main函数 中调用 a函数 的语句时,即转去执行a函数;2.在 a函数 中调用 b函数 时,又转去执行 b函数;3.在 b函数 执行完毕返回 a函数 的断点继续执行;4.在 a函数 执行完毕返回 main函数 的断点继续执行。例如:输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。#include <stdio.h> main() { int n1, n2, n3, n4,max; int max4(int a, int b, int c, int d); printf("请输入4个整数:\n"); scanf_s("%d %d %d %d", &n1, &n2, &n3, &n4); max = max4(n1, n2, n3, n4); printf("max = %d\n", max); } int max4(int a, int b, int c, int d) { int max2(int a, int b); int m; m = max2(a, b); m = max2(m, c); m = max2(m, d); return m; } int max2(int a,int b){ return (a > b ? a : b); }函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。应使用if语句控制结束调用例如:a1 = 10, a2 = a1 +2, a3 = a2+2,以此类推求a36的值。#include <stdio.h> main() { int add(int a); printf("a36 = %d\n", add(36)); } int add(int a) { int sum; if (a == 1) { sum = 10; } else { sum = add(a-1) + 2; } return sum; }例子用递归方法求n!#include <stdio.h> main() { int n; int rec(int a); printf("输入n的值:"); scanf_s("%d", &n); printf("%d的阶乘 = %d\n",n, rec(n)); } int rec(int a) { int x; if (a == 1) { x = 1; } else { x = rec(a-1) * a; } return x; } 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子。#include <stdio.h> main() { int n; int toatal(int a); n = toatal(1); printf("总数 = %d\n",n); } int toatal(int day) { int x; if (day == 10) { x = 1 ; } else { x = (toatal(day + 1) + 1) * 2 ; // 反向思维理解,程序必须有确定值才能进行计算 } //所以程序会先从有确定值的第10天开始从里向外计算 return x; }汉诺(Hanoi)塔问题,古代某寺庙中有一个梵塔,塔内有3个座A、B和C,座A上放着64个大小不等的盘,其中大盘在下,小盘在上。有一个和尚想把这64 个盘从座A搬到座C,但一次只能搬一个盘,搬动的盘只允许放在其他两个座上,且大盘不能压在小盘上,移动过程可以使用B座。编写函数输出移动盘子的步骤。解题思路:1.将A上n-1个盘借助C座先移到B座上;2.把A座上剩下的一个盘移到c座上;3.将n-1个盘从B座借助于A座移到C座上。关键步骤图解#include <stdio.h> main() { int m; void hanoi(int n, char A, char B, char C); printf("输入盘子的数量:\n"); scanf_s("%d", &m); hanoi(m, 'A', 'B', 'C'); } void hanoi(int n,char A,char B, char C) { void move(char x,char y); if (n == 1) { move(A, C); } else { hanoi(n - 1, A, C, B); move(A, C); hanoi(n - 1, B, A, C); } } void move(char x, char y) { printf("%c ==> %c\n", x, y); }
2022年02月12日
253 阅读
0 评论
0 点赞
2022-02-11
C语言函数的调用-学习十七
函数调用的形式一般形式为: 函数名 (实参表列)如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。max();如果实参表列包含多个实参,则各参数间用逗号隔开。max(a,b);按函数调用在程序中出现的形式和位置来分,可以有以下3种函数调用方式:1.函数调用语句把函数调用单独作为一个语句。如: printf_star();这时不要求函数带回值,只要求函数完成一定的操作。2.函数表达式函数调用出现在另一个表达式中。如:c=max(a,b);这时要求函数带回一个确定的值。3.函数参数函数调用作为另一函数调用时的实参。如:m=max(a,max(b,c));其中 max(b,c) 是一次函数调用,它的值作为max另一次调用的实参。函数调用时的数据传递在调用有参函数时,主调函数和被调用函数之间有数据传递关系。定义函数时函数名后面的变量名称为“形式参数”(简称“形参”)。主调函数中调用一个函数时,函数名后面参数称为“实际参数”(简称“实参”)。在调用函数过程中,系统会把实参的值传递给被调用函数的形参。该值在函数调用期间有效,可以参加被调函数中的运算。函数调用的过程在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数的形参被临时分配内存单元。实参与形参的类型应相同或赋值兼容。C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。函数的返回值通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数的返回值)。函数的返回值是通过函数中的return语句获得的。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个就起作用return语句一般形式为:return 表达式; 或者为:return (表达式);例如:return(z); 或者:return Z;函数调用的过程图如果被调用函数中没有return语句,说明程序员没有希望得到函数值。但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。为了明确表示“不带回值”,可以用“void”定义函数“无类型”(或称 “空类型”),此时函数中不得有return语句。例如:void printstar(){ ... }函数值的类型和函数定义中函数的类型应保持一致。如果函数值的类型和return语句中表达式的值不一致,以函数类型为准。凡不加类型说明的函数,自动按整型处理。被调用函数的声明和函数原型声明在一个函数中调用另一个函数需要具备如下条件:1.被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)。2.如果使用库函数,应该在本文件开头加相应的#include指令。3.如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该在前面声明。注意:“定义”是对函数功能的确立,包括指定函数名,函数类型、形参及类型,语句等,是一个完整、独立的函数单位。“声明”是把函数的名字、函数类型和形参的类型、个数以及顺序通知编译系统,以便在调用该函数时系统按此进打对照检查。函数原型声明(函数声明是使用函数原型来声明的)。函数类型 函数名(参数类型1 参数名1,数类型2 参数名2...);函数类型 函数名(参数类型1,参数类型2......);例如:float add(float x, float y);float add(float, float);如果在函数调用之前,没有对函数作说明,则编译系统会把第一次遇到的该函数形式 (函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。如果被调用的函数类型为整型,则允许在调用函数前不做声明。如果被调用函数的定义出现在主调用函数之前,可不必声明。例如#include <stdio.h> // 主调用函数之前定义函数 float add(float x, float y) { float z; z = x + y; return z; } main() { float a, b, c; printf("请输入两个实数:\n"); scanf_s("%f %f", &a, &b); c = add(a, b); printf("结果:%f\n", c); }如果已经在文件的开头( 所有函数之前),对本文中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再作声明。例如#include <stdio.h> float add(float x, float y); //所有函数之前声明 main() { float a, b, c; printf("请输入两个实数:\n"); scanf_s("%f %f", &a, &b); c = add(a, b); printf("结果:%f\n", c); } float add(float x, float y) { float z; z = x + y; return z; }例子将在max函数中定义的变量 z 改为float型。函数返回值的类型与指定的函数类型不同,分析其处理方法。#include <stdio.h> main() { int max(float x, float y); float a,b; int c; printf("请输入两个实数:\n"); scanf_s("%f %f", &a, &b); c = max(a, b); printf("结果:%d\n", c); } int max(float x, float y) { float z; if (x > y) { z = x; } else { z = y; } return z; }因为函数类型为 int ,float转int精度问题导致数据丢失,结果出现了偏差输入两个实数,用一个函数求出它们之和。#include <stdio.h> main() { float add(float x, float y); float a, b,c; printf("请输入两个实数:\n"); scanf_s("%f %f", &a, &b); c = add(a, b); printf("结果:%f\n",c ); } float add(float x, float y) { float z; z = x + y; return z; }编写判断一个数为素数的函数,输出100到200之间的素数。#include <stdio.h> #include <math.h> main() { int leaps(int x); int m, n = 0; for (m = 101; m <200; m=m+2) //偶数不可能是素数 if (leaps(m) == 1) { n++; printf("%d, ", m); if (n % 5 == 0) { printf("\n"); } } } int leaps(int x) { int i, j, leap; j = sqrt(x); //减少计算次数 for (i = 2; i <= j; i++) if (x % i == 0) { leap = 0; break; } else { leap = 1; } return leap; }
2022年02月11日
303 阅读
0 评论
0 点赞
2022-02-10
C语言函数的定义与调用-学习十六
为什么要用函数?问题如果程序的功能比较多,规模比较大把所有代码都写在main函数中, 就会使主函数变得复杂、头绪不清,阅读和维护变得困难。有时程序中要多次实现某一功能,就要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼。解决的方法:用模块化程序设计的思路采里“组装”的办法简化程序设计的过程。事先编好一批实现各种不同功能的函数。把它们保存在函数库中;需要时直接调用。在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能。C程序可由一个主函数和若干个其他函数构成。函数还有很多叫法,比如方法、子例程或程序,等等。例子直接写在主函数#include <stdio.h> int main() { printf("************\n"); printf("Hello Word!\n"); printf("************\n"); return 0; }调用函数#include <stdio.h> int main() { void printf_star(); //声明函数 void printf_text(); //声明函数 printf_star(); //函数调用 printf_text(); printf_star(); return 0; } void printf_star() { printf("************\n"); } void printf_text() { printf("Hello Word!\n"); }说明1.一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将它们分别放在若干个源文件中,由若干个源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序共用。2.一个源程序文件由一个或多个函数以及其他有关内容(如预处理指令、数据声明与定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。3.C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。4.所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是被操作系统调用的5.从用户使用的角度看,函数有两种。库函数。它是由系统提供的,用户不必自己定义而直接使用它们。 应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。用户自己定义的函数。它是用以解决用户专门需要的函数。6.从函数的形式看,函数分两类。无参函数。无参函数- -般用来执行指定的一组操作。 无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。int max()有参函数。在调用函数时,主调函数在调用被调用函数时,通过叁数向被调用函数传递数据。 一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。int max(int a,int b)函数的定义无参函数的定义形式:类型标识符 函数名() { 声明部分 语句 } // 例如 void printf_star() // 函数头 { printf("************\n"); } // 函数体 有参函数定义的一般形式:类型标识符 函数名(形式参数) { 声明部分 语句 } // 例如 int max(int x, inty) // 函数头 { // 函数体 int z; // 局部变量声明 if (x > y) z = x; else z = y; return z; } 定义空函数定义空函数的一般形式为:类型标识符 函数名() { } // 例如 void star() // 函数头 { } // 函数体 先用空函数占一个位置,以后逐步扩充好处:程序结构清楚,可读性好,以后扩充新功能方便,对程序结构影响不大。例子编写一个求阶乘的函数,求5! +6! +7!#include <stdio.h> main() { int factorial(int num); printf("总和为:%d\n", factorial(5) + factorial(6) + factorial(6)); } int factorial(int num) { int sum = 1; for (int i = 1; i <= num; i++) { sum = sum * i; } return sum; }求两个整数的较大者#include <stdio.h> main() { int a,b; printf("请输入两个整数:\n"); scanf_s("%d %d", &a,&b); printf("结果:%d\n", max(a,b)); } int max(int x,int y) { int max; if (x > y) { max = x; } else { max = y; } return max; }
2022年02月10日
283 阅读
0 评论
0 点赞
2022-02-08
C语言数组的应用-学习十五
数组排序排序算法是程序设计中最基本的、最重要的算法之一。排序算法有很多,比较常用的有选择法、冒泡法、比较法和插入法等。选择排序法1.从n个数中选出最小数的下标,然后将最小数与第一个数交换位置;2.除第1个数外,其余n-1个数再按步骤1的方法选出次小的数,与第2个数交换位置;3.重复步骤n-1遍,最后构成递增序列。排序过程图例如:#include <stdio.h> #define N 10 void main() { int i,j,x,min,a[N]; printf("随机输入10整数:\n"); for (i = 0; i < N; i++) { scanf_s("%d", &a[i]); } for (i = 0; i < N - 1; i++) { min = i; for (j = i+1; j < N; j++){ if (a[j] < a[min]) { min = j; x = a[i]; a[i] = a[min]; a[min] = x; } } } for (i = 0; i < 10; i++) { printf("%d,", a[i]); } }冒泡排序法1.从第一个数开始,与相邻的数比较,若大于该数,则交换位置。2.一轮排序后,最大数换到了最下面(即小数往上冒,大数往下沉);3.除最后一个数外,其他n-1个数按步骤:的方法使次大的数下沉;4.重复步骤n-1遍,最后构成递增序列。排序过程图例子#include <stdio.h> #define N 10 main(){ int a[10]; int i,j,t; printf("输入十个整数:\n"); for (i = 0; i<N; i++) { scanf_s("%d", &a[i]); } for (j = 0;j < N-1; j++) { for (i = 0; i < N -1-j; i++) { if (a[i] > a[i + 1]) { t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } } } for (i = 0; i < N; i++) { printf("%d,", a[i]); } }数组中元素的插入和删除插入排序子过程的算法(基于有序数组):假设输入的数为 a ;找到 a 应在数组中的位置;从该位置开始将它及其后面的数依次往后移,将位置腾出;将 a 放入该位置。例如#include <stdio.h> main(){ int a[11] = {1,3,6,9,14,16,21,33,40,50}; int i,j,x=0; for (i = 0; i<10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要插入的整数:"); scanf_s("%d", &x); for (i = 0; i <= 10; i++) { if (a[i] > x) { for (j = 10; j > i; j--) { a[j] = a[j - 1]; } a[i] = x; break; } } for (i = 0; i <=10; i++) { printf("%d ", a[i]); } }删除排序过程的算法:假设删除的数为num找到num应在数组中的位置;从该位置开始将它后面的数依次往前移即可例如:#include <stdio.h> main(){ int a[11] = {1,3,6,9,14,16,21,33,40,50}; int i,j,num=0; for (i = 0; i<10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要删除的整数:"); scanf_s("%d", &num); for (i = 0; i < 10; i++) { if (a[i] == num) { break; } } for (j = i; j <10; j++) { a[j] = a[j + 1]; } for (i = 0; i <9; i++) { printf("%d ", a[i]); } }查找顺序查找思路:将查找关键值与数组中的元素一一比较,若相同,则查找成功,否则查找失败。例如#include <stdio.h> main() { int a[11] = { 1,3,6,9,14,16,21,33,40,50 }; int i, j, x = 0,y = 0; for (i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要查找的整数:"); scanf_s("%d", &x); for (i = 0; i <11; i++) { if (a[i] == x) { y = 1; printf("找到数字%d,它的下标是%d", x, i); break; } } if (y == 0) printf("没有找到你输入的数字!"); }二分法查找(折半查找)可大大提高查找的速度,必须是有序数组。查找过程图例如#include <stdio.h> main() { int a[] = { 1,3,6,9,14,16,21,33,40,50,100}; int i,find=0, mid,x=0, top = 0,bot = 10; for (i = 0; i <=10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要查找的整数:"); scanf_s("%d", &x); do { mid = (top + bot) / 2; if (x > a[mid]) top = mid + 1; if (x == a[mid]) find = 1; if (x < a[mid]) bot = mid - 1; printf("%d,%d,%d\n", top, mid, bot); } while (top <= bot && find == 0); if (find == 1) printf("找到数字%d\n", x); else printf("没有找到你输入的数字!\n"); }二维数组的鞍点一个元素在该行最大,在该列最小的话,称其为数组的鞍点思路:按行求出各行最大的元素位置某行最大的元素与该元素所在列的所有元素比较, 判断是否为最小元素,是则是鞍点,否则不是鞍点。例如:#include<stdio.h> #define N 3 #define M 3 main(){ int i, j, k, a[N][M], max, maxj, flag; printf("请输入数组:\n"); for (i = 0; i < N; i++){ for (j = 0; j < M; j++){ scanf_s("%d", &a[i][j]); } } printf("\n"); for (i = 0; i < N; i++){ max = a[i][0]; // 开始时假设a[i][0]最大 maxj = 0; //将列号0赋给maxj保存 for (j = 0; j < M; j++){ // 找出第i行中的最大数 if (a[i][j] > max){ max = a[i][j]; // 将本行最大的数放在max中 maxj = j; // 将最大数所在的列号存放在maxj中 } } flag = 1; // 先假设是鞍点,以flag为1代表 for (k = 0; k < N; k++){ if (max > a[k][maxj]){ // 将最大的数和其同列元素相比 flag = 0; // 如果max不是同列最小,表示不是鞍点 continue; } } if (flag){ printf("a[%d][%d]=%d\n", i, maxj, max); //输出鞍点的值和所在行列号 break; } } if (!flag){ printf("鞍点不存在!\n"); } }改良版(上面的算法无法判断一些特殊的数组矩阵)#include<stdio.h> #define N 3 #define M 3 main() { int i, j, k,p, a[N][M], max, maxj, flag=0; printf("请输入数组:\n"); for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { scanf_s("%d", &a[i][j]); } } printf("\n"); for (i = 0; i < N; i++) { max = a[i][0]; // 开始时假设a[i][0]最大 maxj = 0; //将列号0赋给maxj保存 for (j = 0; j < M; j++) { // 找出第i行中的最大数 if (a[i][j] > max) { max = a[i][j]; // 将本行最大的数放在max中 } } for (j = 0; j < M; j++) { // 检测最大值是否是鞍点 if (a[i][j] == max) { k = j; p = 0; while (p < N && max <= a[p][k]) { p++; } if (p == N) { printf("a[%d][%d]=%d\n", i, k, max); flag = 1; } } } if (flag == 0) { printf("鞍点不存在!\n"); } } }数组注意问题用scanf函数向字符型数组输入数据char a[20];scanf("%s",&a); 错误 scanf(%s",a); 正确用scanf函数向数值型数组输入数据int a[20];scanf("%d",a); 错误 scanf(%d",&a); 正确引用数组元素要用[]。int i, a(10); for (i=0;i<10;i++) scanf(%d",&a(i)); 错误int i, a(10); for (i=0;i<10;i++) scanf(%d",&a[i])); 正确数组元素可使用的最大下标int i,a[10]={1}; for(i=1;i<=10;i++) printf(%d",a[i]); 错误int i,a[10]={1}; for(i=1;i<=9;i++) printf(%d",a[i]); 或者 for(i=1;i<10;i++) printf(%d",a[i]); 正确二维数据或多维数组的定义和引用int a[4,5]; a[1+2,2+2]=5; 错误int[10]; 正确误以为数组名代表数组全部元素int a[4]={1,3,5,7},b[4]; b=a; char str[4]; str="computer"; 错误混淆字符字符串的表示形式char sex; sex="M"; 错误char sex; sex= ' M '; 正确
2022年02月08日
302 阅读
0 评论
0 点赞
2022-02-07
C语言字符数组-学习十四
字符数组定义用来存放字符数据的数组。字符数组中的一个元素存放一个字符。一般形式char c [10];字符数组也可以是二维或多维数组例如: char c[5][10]; 即为二维字符数组。字符数组初始化逐个字符赋给数组中各元素。例如:char c[10]={'A','b',' ','2',' ','h','a','b','c','d'}; 如果花括号中提供的初值个数大于数组长度,则语法错误;如果初值个数小于数组长度只将这符赋给数组中前面那些元素,其余为'\0';如果初值个数与预定的数组长度相同,在定义时可以省略各数组长度,系统会自动根据初值个数确定数组长度。例如:char c[]={'A','b',' ','2',' ','h','a','b','c','d'}; 例子输出一个字符串。#include <stdio.h> void main() { char c[15] = { 'M','y',' ','n','a','m','e',' ','i','s',' ','X','G','G','M'}; for (int i = 0; i < 15; i++) printf("%c", c[i]); printf(" \n"); }字符串和字符串结束标志在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。有时,人们关心的是有效字符串的长度而不是字符数组的长度。例如,定义一个字符数组长度为100,而实际有效字符只有40个。 为了测定字符串的实际长度,C语言规定了一个“字符串生束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。 也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串。可以把一个字符串直接赋给一个字符数组所表示的变量,以初始化字符数组。例如:char c[]={"l am happy"};也可以省略花括弧,直接写成 char c[]=“l am happy";用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。注意:这里不用单个字符作为初值。而是用一个字符串作为初值。数组c的长度不是10,而是11,因为字符串常量的最后由系统加上一个'\0'。因此,初始化 char c[]="I am happy"; 与 char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'}; 等价。char c[10]={"China"};字符数组的输入输出逐个字符输入输出。用格式符 “%c” 输入或输出一个字符。将整个字符串一次输入或输出。用符 “%s” 输入或输出一个字符串。注意:用%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名,或&c。如果数组长度大于字符串实际长度,也只输出到 '\0' 结束。输出字符不包括结束符 '\0' 。如果一个字符数组中包含一个以上 '\0',则遇到第一个 '\0' 时输出就结束。可以用scanf函数输入一个字符串。例如:char c[20]; scanf("%s",c);如果利用一个scanf函数输入多个字符串,则以空格分隔。例如:#include <stdio.h> #pragma warning(disable:4996) void main() { char str1[5], str2[5], str3[5]; scanf("%s%s%s", str1, str2, str3); printf("%s %s %s\n", str1, str2, str3); }数组首地址在前面介绍过,scanf的各输入项必须以地址方式出现,如&a, &b等。但在前例中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了数组的首地址。整个数组是以首地址开头的一个连续的内存单元。字符串处理函数C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”。使用其它字符串函数则应包含头文件“string. h”。puts(str)作用:将一个字符串(以‘\0结束的字符序列)输出到终端,并且自动换行。例如:#include <stdio.h> #include <string.h> void main() { char str[] = { "China\nBeijin" }; puts(str); }gets(str)作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。例如:#include <stdio.h> #include <string.h> void main() { char str[10]; gets(str); puts(str); }注意:用gets和puts函数只能输入或输出一个字符串不能写成: puts (str1, str2); 或 gets(str1, str2);当输入的字符串中含有空格时,输出仍为全部字符串。说明函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。strcat()作用:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志"\0",结果放在字符数组1中。本函数返回值是字符数组1的首地址。一般形式:strcat(字符数组名1,字符数组名2);要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。例如:#include <stdio.h> #include <string.h> #pragma warning(disable:4996) void main() { char str1[10],str2[5]; printf("输入数组1的值:\n"); gets(str1); printf("输入数组2的值:\n"); gets(str2); strcat(str1, str2); puts(str1); }strcpy()作用:把字符数组2中的字符串拷贝到字符数组1中。字符串结束标志 "\0" 也一同拷贝。字符数组2也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。一般形式:strcpy(字符数组名1,字符数组名2);可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strncpy( str1,str2,2); 拷贝str2的前两个字符和'\O'。要注意的是字符数组1的值会被覆盖,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。str1="China" ; str1=str2; 是错误的,把字符串赋给某个字符数组,只能用strcpy函数。例如:#include <stdio.h> #include <string.h> #pragma warning(disable:4996) void main() { char str1[10], str2[]="China"; strcpy(str1, str2); puts(str1); }strcmp()作用:按照ASCII码从左向右逐个比较两个数组中的字符,直到出现不同字符或 '\0',并由函数返回值返回比较结果。字符串1 = 字符串2,返回值 = 0;字符串1 > 字符串2,返回值 > 0;字符串1 < 字付串2,返回值 < 0;一般形式:strcmp(字符数组名1,字符数组名2);注意:对两个字符串比较,不能以下形式:if(str1>str2) printf("yes");而只能用 if(strcmp(str1,str2)>O) printf("str1>str2");例如:#include <stdio.h> #include <string.h> void main() { int a; char str1[10], str2[]="China"; gets(str1); a = strcmp(str1, str2); if (a == 0) printf("str1 = str2\n"); if (a > 0) printf("str1 > str2\n"); if (a < 0) printf("str1 < str2\n"); }strlen()作用:测字符串的实际长度(不含字符串结束标志“10')并作为函数返回值。一般形式:strlen(字符数组名);例如:#include <stdio.h> #include <string.h> void main() { int a; char str[] = "China"; a = strlen(str); printf("字符串的长度是 %d\n", a); }strlwr()格式:strlwr(字符串);作用:将字符串中大写字母换成小写字母。strupr()格式:strupr 宁等串);作用:将字符串中小写字母换成大写字母。例子输入一串字符,统计数字的个数。#include <stdio.h> #include <string.h> void main() { char str[10],c; int i, num=0; gets(str); for (i = 0; (c = str[i]) != '\0'; i++) if (c >= '0'&&c <= '9') num++; printf("%d\n", num); }输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。#include <stdio.h> #include <string.h> void main() { int i,word=0,num=0; char c,str[80]; gets(str); printf("i\t,str[i]\t,word\t,num\n"); for (i = 0; (c = str[i]) != '\0'; i++) { if (c == ' ') word=0; else if (word == 0) { word = 1; num++; } printf("%d\t,%c\t,%d\t,%d\n", i, str[i], word, num); } printf("单词的个数是 %d\n", num); }
2022年02月07日
304 阅读
0 评论
0 点赞
1
...
6
7
8
...
10