goto
无条件跳转语句,通常跟if语句配合使用,goto跳转,只能在当前函数内跳转
int main(int argc, const char * argv[]){
int n;
scanf("%d",&n);
number:
if (n<10) {
n++;
goto number;
}
return 0;
}
goto 求1~100的和
int main(int argc, const char *argv[])
{
int i=1,sum=0;
number:
sum+=i;
i++;
if (i<=100) {
goto number;
}
printf("sum = %d\n", sum);
return 0;
}
goto 错误写法
void print(void)//错误写法
{
number:
printf("hello world\n");
}
int main(int argc, const char *argv[])
{
int i;
scanf("%d",&i);
if (i<10) {
goto number;
}
return 0;
}
统计输入字符个数
ahangxueming\n
int main(int argc, const char *argv[])
{
char ch;
int count=0;
while (scanf("%c",&ch),ch!='\n') {
count++;
}
printf("count = %d", count);
printf("%c",ch);
return 0;
}
int main(int argc, const char *argv[])
{
int count=0;
while (getchar()!='\n') {
count++;
}
printf("count = %d\n",count);
return 0;
}
条件语句 if(num) 如果num>0 就为真
int main(int argc,const char *argv[])
{
int num;
int ret;
ret = scanf("%d",&num);
if (ret) {
printf("Y\n");
}
else
{
printf("N\n");
}
return 0;
}
while和do-while的区别
do
{
循环体语句列表;
}while(条件表达式);
先执行循环语句体,再判断表达式是否成立,表达式成立,则继续执行循环语句体,直到表达式不成立,退出循环
求1-100以内的奇数的和(dowhile做)
int main(int argc,const char *argv[])
{
int i=1,sum=0;
do{
if (i%2)
{
sum+=i;
}
i++;
}while (i<100);
printf("sum = %d\n", sum);
return 0;
}
for
for (初始化表达式;条件表达式; 自增自减表达式) {
循环语句体;
}
for的初始条件,自增条件,和条件表达式都可以省略
//输入一个整数,求他的各位数字之和.如:178,数字之和为1+7+8 = 16
int main(int argc,const char *argv[])
{
int num;
int sum=0;
scanf("%d", &num);
for (; num!=0; )
{
sum+=num%10;
num/=10;
}
printf("sum = %d\n", sum);
return 0;
}
//for( ; ; ;)演示
int main(int argc,const char *argv[])
{
int i=0;
for (; ; )
{
if (i<10)
{
printf("hello world\n");
}
else
{
break;
}
i++;
}
return 0;
}
break, continue
continue : 结束当次循环,继续执行下一次循环
break: 跳出当前对应的整个循环,但是只能跳出一层循环
int main(int argc,const char *argv[])
{
for (int i=0; i<10; i++)
{
if (i==5) {
continue;
//break;
}
printf("i =%d ",i);
printf("hello world\n");
}
putchar('\n');
return 0;
}
编程例子
九九乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72
int main(int argc, const char *argv[])
{
int i, j;
for (i=1; i<=9; i++) {
for (j=1; j<=i; j++) {
printf("%d*%d=%2d ",j,i,j*i);
}
printf("\n");
}
return 0;
}
求1~100内所有的素数
int main(int argc,const char *argv[])
{
int i,j;
for (i=1; i<=100; i++) {
//判断i是否为素数
for (j=2; j<i; j++) {
if (!(i%j)) {
break;
}
}
if (j!=i) {
continue;
}
printf("%d ",i);
}
printf("\n");
return 0;
}
字母金字塔1
输入:F
\
输出:
F
EFE
DEFED
CDEFEDC
BCDEFEDCB
ABCDEFEDCBA
int main(int argc,constchar *argv[])
{
char ch;
scanf("%c",&ch);
int i,j;
for (i=0; i<ch-'A'+1; i++) {
for (j=ch-'A'-i; j>0 ; j--)
{
printf(" ");
}
for (j=i; j>=0; j--) {
printf("%c",ch-j);
}
for (j=0; j<i; j++) {
printf("%c", ch-1-j);
}
printf("\n");
}
return 0;
}
字母金字塔2
流程控制(for循环)输入一个大写字母,如F
比如:
输入:F
输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
int main(int argc,const char *argv[])
{
char ch;
scanf("%c", &ch);
for (int i=0; i < ch-'A'+1; i++) {
for (int j = ch-'A'-i; j>0; j--) {
printf(" ");
}
for (int j=0; j<=i; j++) {
printf("%c",'A'+j);
}
for (int j=i; j>0; j--) {
printf("%c",'A'+j-1);
}
printf("\n");
}
return 0;
}
字母金字塔3
输入一个大写字符,如F
比如:
输入:F
输出:
FEDCBA
EDCBAB
DCBABC
CBABCD
BABCDE
ABCDEF
int main(int argc, const char *argv[])
{
char ch;
scanf("%c",&ch);
for (int i=0; i<ch-'A'+1; i++) {
for (int j=i; j>0; j--) {
printf(" ");
}
for (int j=i; j<ch-'A'+1; j++) {
printf("%c", ch-j);
}
for (int j=0; j<i; j++) {
printf("%c",'A'+1+j);
}
printf("\n");
}
return 0;
}
字母金字塔四
输入一个大写字母,如F
比如:
输入:F
输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
输入:C
输出:
A
ABA
ABCBA
int main(int argc,const char *argv[])
{
char ch;
scanf("%c",&ch);
for (int i=0; i<ch-'A'+1; i++) {
for (int j=0; j<=i; j++) {
printf("%c", 'A'+j);
}
for (int j=i; j>0; j--) {
printf("%c",'A'+j-1);
}
printf("\n");
}
return 0;
}
字母金字塔五
输入一个大写字母,如 F,输出
比如:
输入:F
输出:
F
EFE
DEFED
CDEFEDC
BCDEFEDCB
ABCDEFEDCBA
输入:D
输出:
D
CDC
BCDCB
ABCDCBA
#include <stdio.h>
int main(int argc,const char *argv[])
{ char ch;
int i,j;
scanf("%c",&ch);
for(i=0;i<ch-'A'+1;i++)
{
for(j=i;j>=0;j--){
printf("%c",ch-j);
}
for (j=0;j<i; j++) {
printf("%c",ch-j-1);
}
printf("\n");
}
return 0;
}
字母金字塔六
使用嵌套循环产生下列图案:输入底边长 n
比如:
输入:F
输出:
F
FE
FED
FEDC
FEDCB
FEDCBA
输入:C
输出:
C
CB
CBA
#include <stdio.h>
int main(int argc,const char *argv[])
{ char ch;
int i,j;
scanf("%c",&ch);
for(i=0;i<ch-'A'+1;i++)
{
for(j=0;j<=i;j++){
printf("%c",ch-j);
}
printf("\n");
}
return 0;
}
斐波那契数列1
输出数字序列2/1,3/2,5/3,8/5,13/8,21/13...,输出个数由键盘输入。注意输入使用scanf输入
比如:
输入 3输出为
2/1
3/2
5/3
输入 4 输出为
2/1
3/2
5/3
8/5
int main(int argc,const char *argv[])
{
for (int i=0; i<10; i++)
{
if (i==5) {
continue;
//break;
}
printf("i =%d ",i);
printf("hello world\n");
}
putchar('\n');
return 0;
}
斐波那契数列2
输出数字序列 1,2,3,5,8,13,21...,输出个数由键盘输入。注意输入使用scanf输入
比如:
输入 3输出为
1
2
3
输入 4 输出为
1
2
3
5
int main(int argc,const char *argv[])
{
int a=1,b=0;
int n;
scanf("%d",&n);
for (int i=0; i<n; i++) {
printf("%d ", a+b);
int temp;
temp = a;
a=a+b;
b=temp;
}
putchar('\n');
return 0;
}
斐波那契数列3
输出斐波那契数列的前20项
1 1 2 3 581321345589 ....
a[n]=a[n-1]+a[n-2]
int main(int argc,const char *argv[])
{
int a[20]={1,1};
for (int i=2; i<20; i++) {
a[i]=a[i-1]+a[i-2];
}
for (int i=0; i<20; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
斐波那契数列4 递归法
int fabonaci(int n)
{
if (n==1 || n==2) {
return 1;
}
return fabonaci(n-1)+fabonaci(n-2);
}
int main(int argc,const char *argv[])
{
for (int i=1; i<=50; i++) {
printf("%d ",fabonaci(i));
}
printf("\n");
return 0;
}
不借助第三个变量交换两个变量的值
int main(int argc, const char *argv[])
{
int a=3, b=5;
a=a+b;//a=8;
b=a-b;//b=3;
a=a-b;//a=5;
printf("a=%d b=%d\n",a, b);
return 0;
}
求阶乘 输入n(int类型),打印1!+2!+3!+4!+5!+。。。+n!的值
int main(int argc,const char *argv[])
{
int Sn=0;
int n;
int temp=1;
scanf("%d",&n);
for (int i=1; i<=n; i++)
{
temp=i*temp;
Sn+=temp;
}
printf("Sn = %d\n", Sn);
return 0;
}
用辗转相除法求最大公约数
a b
319 377 ---319
a b
377 319 ---58
a b
319 58 ---29
a b
58 29 ---0
a b
29 0
300 480 300
480 300 180
300 180 120
180 120 60
120 60 0
60 0
int main(int argc, const char *argv[])
{
int a, b;
scanf("%d%d",&a,&b);
while (b!=0) {
int temp;
temp = a%b;
a=b;
b=temp;
}
printf("最大公约数%d\n",a);
return 0;
}
用递归法求最大公约数
如果a除以b能整除,则最大公约数是b。
否则,最大公约数等于b和a%b的最大公约数。
int euclid(int a,int b)
{
if(a%b==0)
{
return b;
}
return euclid(b, a%b);
}
int main(int argc,const char *argv[])
{
printf("%d\n", euclid(319, 377));
return 0;
}
倒序输出两个大写字母之间的字母序
比如:
输入 U Y
输出为
Y
X
W
V
U
输入 V X 输出为
X
W
V
#include <stdio.h>
#include <stdlib.h>
int main(int argc,const char *argv[])
{
char ch1,ch2;
scanf("%c %c",&ch1,&ch2);
for (int i=0; i< abs(ch1-ch2)+1; i++) {
if (ch1>ch2) {
printf("%c ",ch1-i);
}
else
{
printf("%c ",ch2-i);
}
}
printf("\n");
return 0;
}
整数逆置
给定一个 5 位的整数,将该数按照 10进制位逆置,
例如给定 12345 变成 54321
12320 变成2321
int main(int argc,const char *argv[])
{
int num;
scanf("%d",&num);
if (num<10000 || num >99999)
{
return -1;
}
while (num%10==0)
{
num/=10;
}
while (num)
{
int temp = num%10;
printf("%d",temp);
num/=10;
}
printf("\n");
return 0;
}
输入一个自然数n,统计 n! 末尾有多少个0?
5! 1 120 5*4*3*2*1
10! 2 2*5*9*8*7*6*5*4*3*2*1
15! 5 10 15 3
25! 5 10 15 2025 6
int main(int argc,const char *argv[])
{
int n;
int count=0;
scanf("%d", &n );
for (int i=n/5; i>0; )
{
// int temp=i;
// while (!(temp%5))
// {
// count++;
// temp/=5;
// }
count+=i;
i/=5;
}
printf("%d\n", count);
return 0;
}
递增,递减序列
输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列
比如:
输入:1 598122130 -19
输出:
1 59
9 8
8 1221
21 30 -1
-1 9
输入: 3 98 -114218 -302
输出:
3 9
9 8 -11
-11 421
21 8 -3
-3 02
int main(int argc,constchar *argv[])
{
int arr[10];
for (int i=0; i<10; i++) {
scanf("%d", &arr[i]);
}
printf("%d ", arr[0]);
for (int i=1; i<9; i++) {
printf("%d ",arr[i]);
if ((arr[i]>arr[i-1] && arr[i]>arr[i+1])||(arr[i]<arr[i-1]&&arr[i]<arr[i+1]) ) {
printf("\n");
printf("%d ",arr[i]);
}
}
printf("%d\n",arr[9]);
return 0;
}
计算字符宽度
计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为
1cm,数字宽度为0.5cm、标点符号宽度为0.8cm。
//1.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。
//2.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好使 10cm宽的行能容纳。输出这个被截断的子数组。
float jugechar(char ch)
{
if ((ch>='A'&& ch<='Z') || (ch>='a'&&ch<='z'))
{
return 1.0;
}
else if (ch>='0'&&ch<='9')
{
return 0.5;
}
else
{
return 0.8;
}
}
int main(int argc,constchar * argv[])
{
char str[100];
float length=0.0;
int i=0;
/*scanf("%s",str);
int len= (int)strlen(str);
*/
while (scanf("%c",&str[i]),str[i]!='\n')
{
i++;
}
str[i]='\0';
int len = i+1;
for (i=0; i<len; i++) {
length+=jugechar(str[i]);
if (length>10) {
str[i]='\0';
break;
}
}
printf("%s\n",str);
return 0;
}
输出二项式系数
1
1 1
1 2 1
1 3 3 1
1 4 6 41
1 5 10 10 51
int main(int argc,const char *argv[])
{
int a[10][10]={};
for (int i=0; i<10; i++)
{
for (int j=0; j<=i; j++)
{
if (j==i || j==0)
{
a[i][j]=1;
}
else
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
for (int i=0; i<10; i++) {
printf("%*d",24-2*i, a[i][0]);
for (int j=1; j<=i; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}
n*n矩阵转置
1 234 1534
5 678 -> 2627
3 259 3752
4 723 4893
void reverse(int *a[],int n)
{
for (int i=0; i<n; i++) {
for (int j=i; j<n; j++) {
int temp = a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
}
int main(int argc,constchar *argv[])
{
int a[3][3]={
{1,2,3},
{4,5,6},
{7,8,9}
};
int *p[3];
for (int i=0; i<3; i++) {
p[i]=a[i];
}
reverse(p, 3);
/*for (int i=0; i<3; i++) {
for (int j=i; j<3; j++) {
if (i!=j)
{
int temp = a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
}*/
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
nXn的矩阵 转圈赋值
输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限
比如:
输入:5 18
输出:
1 2 3 4 5
16 17180 6
15 0 0 0 7
14 0 0 0 8
13 1211109
输入: 4 12
输出:
1 2 3 4
12 0 0 5
11 0 0 6
10 9 8 7
int main(int argc,constchar *argv[])
{
int a[20][20]={};
int m,n;
int type=1;//1:从左往右赋值, 2:从上往下赋值 3:从右往左赋值 4:从下往上
int s1,s2,s3,s4,i;//控制边界
scanf("%d%d",&n,&m);
if (n<0 || n>20 || m>n*n) {
return -1;
}
s1=n-1;
s2=n-1;
s3=0;
s4=1;
int p=0,q=0;//控制二维数组下标
for (i=1; i<=m; i++) {
a[p][q]=i;
switch (type) {
case 1://从左往右赋值
q++;
if (q==s1) {
type=2;
s1--;
}
break;
case 2:
p++;
if (p==s2) {
type=3;
s2--;
}
break;
case 3:
q--;
if (q==s3) {
type=4;
s3++;
}
break;
case 4:
p--;
if (p==s4) {
type=1;
s4++;
}
break;
default:
break;
}
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
围圈报数
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来第几号的哪位。
1. 有m个人围成一圈,开始报数,报道n,退出,问最后剩下的是几号。(从1号开始)
比如:
输入:5 3
输出:
4
输入: 6 2
输出:
5
int main(int argc,constchar *argv[])
{
int a[20];
int m,n,cnt=0,k=0,i=0;
scanf("%d%d",&m,&n);
if (m<1 || m>20 || n<1) {
return -1;
}
for (int i=0; i<m; i++) {
a[i]=i+1;
}
while (cnt < m-1)
{
if (a[i]) {
k++;
}
if (k==n) {
cnt++;
a[i]=0;
k=0;
}
i++;
if (i==m) {
i=0;
}
}
i=0;
while (a[i]==0) {
i++;
}
printf("%d\n",a[i]);
}
魔方阵
魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。
比如:
输入:3
输出:
6 18
7 53
2 94
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1/减1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
int main(int argc,constchar *argv[])
{
int a[19][19]={};
int n;
int i,j,tempi,tempj;
int k=1;
scanf("%d",&n);
if (n<3||n%2==0||n>19)
{
return -1;
}
i=0;
j=n/2;
while (k<=n*n)
{
a[i][j]=k++;
tempi = i;
tempj = j;
i--;
j--;
if (tempi==0)
{
i=n-1;
}
if (tempj==0)
{
j=n-1;
}
if (a[i][j]) {
i=tempi+1;
j=tempj;
}
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
找出数组中出现次数最多的数
输入10个数,找出出现次数最多的数(如果多个并列,则按数字出现顺序分别输出)
比如:
输入:1 223456789
输出:2
数据结构:定义一个整型数组 int count[10]存储每个元素的个数,开始时每个元素个数初始化为1
算法:
(1) 利用双层循环,每一个元素都与后面一个元素比较,如果两者相同,则该元素次数+1,
(2) 以上的算法中两个相同的元素的次数是一样的,优化如下,比较两个元素的时候,如果两者相等,则该元素次数+1,后面的元素次数设置为0,比较的时候再判断这个元素是否已经比较
//1 2 3 4 5 3 3 2 1 2 a[10]
//2 1 1 1 1 1 1 1 0 1 count[10]
int main(int argc,constchar *argv[])
{
int a[10];
int cnt[10];
int max;
for (int i=0; i<10; i++) {
scanf("%d", &a[i]);
cnt[i]=1;
}
for (int i=0; i<10; i++) {
if (cnt[i]) {
for (int j=i+1; j<10; j++) {
if (a[j]==a[i]) {
cnt[i]++;
cnt[j]=0;
}
}
}
}
max = cnt[0];
for (int i=1; i<10; i++) {
if (cnt[i]>max) {
max = cnt[i];
}
}
for (int i=0; i<10; i++) {
if (max == cnt[i]) {
printf("%d ", a[i]);
}
}
printf("\n");
return 0;
}
数组常规操作
数组初始化
定义一个数组后,如果不初始化,那么数组的值是未定义的;
1.完全初始化:把数组中的每个成员都给初值;
int main(int argc, const char *argv[])
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
for (int i=0; i<10; i++) {
printf("%d ", a[i]);
}
return 0;
}
2.部分初始化:只对数组部分元素赋初值
int main(int argc,const char *argv[])
{
int a[10]={1,2,3};
for (int i=0; i<10; i++) {
printf("%d ",a[i]);
}
return 0;
}
3.数组初始化为0;
int main(int argc,const char *argv[])
{
int a[10]={};
int a[10]={0};
for (int i=0; i<10; i++) {
printf("%d ", a[i]);
}
return 0;
}
4.省约数组长度,必须初始化
int a[]={1,2,3};
int main(int argc, const char * argv[])
{
int a[]={1,2,3,4};
printf("%ld\n",sizeof(a));
return 0;
}
数组的倒序操作
int main(int argc, const char *argv[])
{
int score[5];
for (int i=4; i>=0; i--) {
scanf("%d",&score[i]);
}
for (int i=0; i<5; i++) {
printf("%d ", score[i]);
}
printf("\n");
return 0;
}
查找某个数值 打印数值下标
int main(int argc,const char *argv[])
{
int a[10]={0};
int i,val;
int flag=0;
for (i=0; i<10; i++) {
scanf("%d",&a[i]);
}
printf("请输入要查找的数值: ");
scanf("%d",&val);
for (i=0; i<10; i++) {
if (a[i]==val) {
flag =1;
printf("%d ",i);
}
}
if (!flag) {
printf("没有该数值");
}
printf("\n");
return 0;
}
字符数组
int main(int argc,const char *argv[])
{
int a[10]={};
printf("%p\n",a); 数组名是一个地址常量
printf("%p\n",&a[0]);
printf("%p\n",&a);
return 0;
}
int main(int argc,const char *argv[])
{
char str[20]="hello world";
char str[10]={'h','e','l','l','o'};
char str[11]="helloworld";
printf("%s\n", str);
return 0;
}
二维数组
int a[5][6];
把二维数组看成由一维数组组成的数组
int main(int argc,const char *argv[])
{
int a[3][2]={};
for (int i=0; i<3; i++) {
for (int j=0; j<2; j++) {
scanf("%d",&a[i][j]);
printf("%d ",a[i][j]);
}
}
printf("\n");
printf("%ld\n", sizeof(a));
return 0;
}
int main(int argc,const char *argv[])
{
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={{1,2,3},
{4,5,6}};
for (int i=0; i<2; i++) {
for (int j=0; j<3;j++) {
printf("%d ", a[i][j]);
}
}
return 0;
}
递归法求趣味年龄问题
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。
int age(int n)
{
if (n==1) {
return 10;
}
return 2+age(n-1);
}
int main(int argc, const char *argv[])
{
printf("%d ", age(5));
return 0;
}
递归法求求n!
5 = 5*4!120
4!= 4*3!24
3!= 3*2!6
2!= 2*1!2
1!= 1
factrial(2)=2*factrial(1)
factrial(3)=3*factrial(2)=3*2*factrial(1)
int factrial(int n)
{
if (n==1)
{
return 1;
}
return n*factrial(n-1);
}
int main(int argc, const char *argv[])
{
printf("%d\n",factrial(5));
return 0;
}
递归法求小明走阶梯
小明一次可以爬一级或者二级台阶试问n级台阶小明来走共有几种走法
示例:
台阶数1 走法1
台阶数2 走法21. 一级一级2.二级
台阶数3 走法31.一级一级一级2.一级二级3.二级一级
4 111112121111222
int func(int n)
{
if (n==1)
{
return 1;
}
else if (n==2)
{
return 2;
}
else
{
return func(n-1)+func(n-2);
}
}
int main(int argc, const char * argv[])
{
printf("%d\n",func(6));
return 0;
}
字符串
1. 字符串中每个字符占用一个字节内存空间
2. 字符串必须以'\0'表示结束
3. 字符串要用双引号括起来
基本操作
int main(int argc, const char * argv[])
{
printf("alnum = %d\n", isalnum('A'));//判断是否为数字或者字母
printf("alpha = %d\n", isalpha('a'));//判断是否为字母是返回1, 反之返回0
printf("isdigit = %d\n", isdigit('9'));//判断是否为十进制数字字符
printf("isgraph = %d\n",isgraph('\t'));//判断是否为可见字符
printf("islower = %d\n", islower('a'));//判断是否为小写字母
printf("isspace = %d\n",isspace(' '));//判断是否为空格
printf("isupper = %d\n",isupper('a'));//判断是否为大写字母
printf("isxdigit = %d\n", isxdigit('F'));//是否为十六进制字符
printf("tolower = %c\n",tolower('A'));//把大写字母转换成小写字母
printf("toupper = %c\n", toupper('a'));//把小写字母转换成大写字母
printf("digittoint= %d\n", digittoint('f'));//把十六进制字符转换成十进制整型
printf("ishexnumber = %d\n",ishexnumber('e'));//类似isxdigit()
printf("isnumber = %d\n",isnumber('F'));//类似isdigit()
return 0;
}
求长度
字符串有效长度(不包含'\0')
strlen()
求变量或者常量占用内存空间大小
sizeof()
区别:
1.strlen求字符串有效长度,sizeof求变量或者常量占用内存空间大小;
2.strlen是一个函数,在函数调用的时候执行,sizeof是一个运算符, 在编译的执行
#include <ctype.h>
#include <string.h>
unsigned long mystrlen(char *src)
{
char *pstr = src;
unsigned long len=0;
while (*pstr!='\0') {
len++;
pstr++;
}
return len;
}
int main(int argc,const char *argv[])
{
//char str[4]={'a','b','c','d'};
//printf("%lu\n", sizeof("\0"));
//printf("%lu\n", strlen("hello world"));
//printf("len = %lu\n",strlen(str));
printf("%lu\n", mystrlen("qinafeng"));
return 0;
}
字符串拷贝函数
字符串不能直接赋值,
strcpy
char *strcpy(char *dest, const char *src);
strcpy拷贝包含'\0'
dest 跟 src指向的内存空间不呢过重叠(段错误)
dest 指向的内存空间足够容纳src
自己实现一个mystrcpy
char *mystrcpy(char *dest, const char *src)
{
char *pstr = dest;
while (*src) {
*pstr = *src;
pstr++;
src++;
}
*pstr = '\0';
return dest;
}
int main(int argc,const char *argv[])
{
//char str1[20]="hello world";
char str1[100];
char str2[20]="wjlhelloworld";
mystrcpy(str1, str2);
printf("%s\n", mystrcpy(str1, str2));
// strcpy(str1, str2);
//printf("%s\n", strcpy(str1, str2));
// printf("%s\n",&str1[9]);
// strcpy(str1, &str1[5]);
// printf("%s\n",str1);
return 0;
}
char *strncpy(char *dest, const char *src, size_t size);
size_t == unsigned long
size_t size: 允许从src指向的字符串中最多拷贝到dest中的字节数
strncpy 拷贝后得到的字符串不一定以'\0'结束
dest 跟 src指向的内存空间不呢过重叠
int main(int argc, const char *argv[])
{
char str1[100];
char str2[20]="hello world";
strncpy(str1, str2, 99);
str1[99]='\0';
printf("%s\n", str1);
return 0;
}
字符串拼接函数 strcat strncat
char *strcat(char *dest , const char *src);
dest src 指向的内存不能重叠
dest 剩下的内存足够容纳src指向的字符串长度
char *mystrcat(char *dest, const char *src)
{
size_t len = strlen(dest);
char *pstr = dest+len;
while (*src)
{
*pstr = *src;
pstr++;
src++;
}
*pstr = '\0';
return dest;
}
int main(int argc,const char *argv[])
{
char dest[100]="hello world";
char src[50]="qian feng";
//printf("%s\n", strcat(dest, src));
printf("%s\n", mystrcat(dest, src));
//printf("%s\n", strcat(dest, &dest[3]));
return 0;
}
char *strncat(char *dest , const char *src, size_t size);
size : 允许从src中最大拷贝字节数
得到的新字符串自动添加'\0';
int main(int argc,const char *argv[])
{
char str1[20];
str1[18]='@';
str1[19]='\0';
char str2[40]="qianfengyuioprtyuiopertyu";
//strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);
strncat(str1, str2, 18);
printf("%s\n", str1);
return 0;
}
字符串比较函数
strcmp
int strcmp(const char *str1, const char *str2);
返回值:
大于0 str1 > str2
等于0 str1== str2
小于0 str1 < str2
int mystrcmp(char *str1,char *str2)
{
while (*str1 && *str2) {
if (*str1!=*str2) {
//return *str1-*str2;
break;
}
str1++;
str2++;
}
return *str1-*str2;
}
int main(int argc,const char *argv[])
{
char *str1="hello wabcd";
char *str2="hello wabbd";
//printf("val = %d\n", strcmp(str1, str2));
printf("val = %d\n", mystrcmp(str1, str2));
return 0;
}
strncmp
int strncmp(const char *str1, const char *str2, size_t size);
size : 表示最大比较字节数
int main(int argc,const char *argv[])
{
char *str1 = "hellowo";
char *str2 = "helloworld";
// printf("val = %d\n",strncmp(str1, str2, (size_t)sizeof(str1)));
printf("val = %d\n",strncmp(str1, str2, 11));
return 0;
}
字符串排序
比较三个字符串的大小,然后按从小到大的顺序将字符串输出。
比如:
输入
asdfwd
ddrwf
ffweff
输出为
asdfwd
ddrwf
ffweff
输入
sgfgeasdfw
aabbe
wrwwdfaf
输出为
aabbe
sgfgeasdfw
wrwwdfaf
#include <stdlib.h>
#include <string.h>
int main(int argc,constchar * argv[])
{
char *pstr[10]={NULL};
int cnt = 0;
for (int i=0; i<10; i++) {
pstr[i]=(char *)calloc(100,1);
if (!pstr[i]) {
return -1;
}
scanf("%s",pstr[i]);
cnt++;
if (getchar()=='\n') {
break;
}
}
for (int i=0; i<cnt-1; i++) {
for (int j=0; j<cnt-i-1; j++) {
if (strcmp(pstr[j], pstr[j+1])>0) {
char *temp = pstr[j];
pstr[j]=pstr[j+1];
pstr[j+1]=temp;
}
}
}
for (int i=0; i<cnt; i++) {
printf("%s\n", pstr[i]);
free(pstr[i]);
pstr[i]=NULL;
}
return 0;
}
字符串查找字符
查找一个字符在字符串1中第一次出现的字符位置,
比如:
输入
asdfwd
d
输出为
2
输入
hhff
h
输出为
0
int main(int argc,const char *argv[])
{
char str[100];
char ch;
scanf("%s %c", str, &ch);
char *pstr = strchr(str, ch);
printf("%lu\n", pstr-str);
return 0;
}
求一个字符串s的最大连续递增数字子串。
比如:
输入
f123fffwf3210a1234
输出为
123
#include <ctype.h>
int main(int argc,const char *argv[])
{
char str[100];
char *pstr = str;
char *pmax = NULL;
int maxlen=0;
int cnt=0;
scanf("%s", str);
while (*pstr)
{
if (isdigit(*pstr))
{
cnt = 1;
while (*pstr == *(pstr+1)-1) {
cnt++;
pstr++;
}
pstr++;
if (maxlen < cnt) {
maxlen = cnt;
pmax = pstr -cnt;
cnt = 0;
}
}
else
{
pstr++;
}
}
if (pmax) {
*(pmax + maxlen)='\0';
printf("%s\n", pmax);
}
return 0;
}
字符串压缩算法
把输入的字符串压缩处理后的结果保存到第二个字符串中,并输出。
比如:
输入:aaaaaaaaaaaeefggg
输出为:a11e2f1g3
输入:eeeeeaaaff
压缩为:e5a3f2
int main(int argc,const char *argv[])
{
char str[100];
char buf[100];
scanf("%s", str);
char *pbuf = buf;
char *pstr = str;
char ch = *pstr;
int cnt = 0;
int val=0;
while (*pstr)
{
if (*pstr == ch)
{
cnt++;
}
else
{
val = sprintf(pbuf, "%c%d",ch,cnt);
pbuf+=val;
cnt=0;
ch = *pstr;
pstr--;
}
pstr++;
}
val = sprintf(pbuf, "%c%d", ch, cnt);
pbuf+=val;
*pbuf='\0';
printf("%s\n", buf);
return 0;
}
字符串解压缩算法
把输入字符串解压处理后结果保存在第二个字符串中,并输出。
比如:
输入:a11e2f1g3
输出:aaaaaaaaaaaeefggg
输入:e5a3f2
输出:eeeeeaaaff
char * str_write(char *pstr,char ch,int len)
{
for (int i=0; i<len; i++) {
pstr[i]=ch;
}
pstr[len]='\0';
return pstr;
}
int main(int argc,constchar *argv[])
{
char str[100];
char buf[100];
scanf("%s", str);
char *pstr = str;
char *pbuf = buf;
char ch;
int len = 0;
while (*pstr)
{
ch = *pstr;
sscanf(pstr, "%c%d", &ch, &len);
str_write(pbuf, ch, len);
pbuf += len;
pstr++;
while (isdigit(*pstr))
{
pstr++;
}
}
// pbuf = buf;
// pstr = str;
printf("%s\n", buf);
return 0;
}
以空格作为分隔符,统计单词个数
"wangjunling love hello world"
" i love you fallinto"
int word_number(const char *str) {
int cnt=0;
int flag=0;
while (*str)
{
if (*str!=' ')
{
if (!flag)
{
cnt++;
flag=1;
}
}
else
{
if (flag) {
flag =0;
}
}
str++;
}
return cnt;
}
int main(int argc, const char *argv[]){
char str[100]={};
scanf("%[^\n]", str);
printf("%d\n", word_number(str));
return 0;
}
字符查找函数
strchr strrchr
char *strchr(const char *src, char ch);
查找在src中第一次出现的字符ch,把字符的地址返回
没有找到返回null
char *mystrchar(const char *src, char ch)
{
while (*src) {
if (*src==ch) {
return (char *)src;
}
src++;
}
return NULL;
}
int main(int argc,const char *argv[])
{
char str[]="hello world";
//printf("%s\n", strchr(str, 'H'));
printf("%s\n", mystrchar(str,'w'));
return 0;
}
倒序查找字符
char *strrchr(const char *src, char ch);
倒序查找字符
char *mystrrchr(const char *src, char ch)
{
long len = strlen(src);
char *pstr = (char *)src+len-1;
for (long i=len-1; i>=0; i--) {
if (*pstr==ch) {
return pstr;
}
pstr--;
}
return NULL;
}
int main(int argc,const char *argv[])
{
char *str="hello world";
printf("%s\n", mystrrchr(str, 'o'));
return 0;
}
字符串查找函数
strstr
char *strstr(const char *, const char *);
找到字串返回字串在原串中的地址没有找到返回null
int main(int argc,const char *argv[])
{
char str[]="qianfenghellofengworldfengzhang";
//printf("%s\n", strstr(str, "feng"));
char *pstr1, *pstr2;
pstr1 = pstr2 = str;
while ((pstr2 = strstr(pstr2, "feng")))
{
*pstr2 = '\0';
printf("%s\n", pstr1);
pstr2+=strlen("feng");
pstr1 = pstr2;
}
printf("%s\n", pstr1);
return 0;
}
字符串分割函数
strtok
char *strtok(char *src, const char *demi);
1.分割符必须用双引号包含
2.首次分割,传字符串首地址,从第二次的开始传NULL
3.每次分割后,返回分割后的字符串地址
int main(int argc,const char *argv[])
{
char str[]="hello:world,:qian;;:,feng*&hello;:";
// char *pstr = strtok(str, ":");
// printf("%s\n", pstr);
// pstr = strtok(NULL, ":;,*&");
// printf("%s\n", pstr);
char *pstr=str;
while ((pstr=strtok(pstr,":;,*&"))) {
printf("%s\n", pstr);
pstr = NULL;
}
return 0;
}
字符串解析函数
sscanf
从字符缓冲区中解析数据到内存变量中
int sscanf(const char *src, const char *format, ...)
sprintf
int sprintf(char *dst, const char *format, ...)
scanf
标准输入文件缓冲区 stdin
printf
标准输出文件缓冲区 stdout
int main(int argc,const char *argv[])
{
int a, b;
scanf("%d%d",&a,&b);
printf("a = %d b = %d\n", a, b);
char str[]="#123*23.4#";
int a;
float b;
sscanf(str, "#%d*%f#",&a, &b);
printf("a = %d b= %.2f\n", a, b);
int a = 39;
float b = 3.14;
char *str = "hello world";
char buf[500];
sprintf(buf, "%d%f%s", a,b,str);
printf("%s\n", buf);
return 0;
}
文件解析函数
fscanf fprintf
int fprintf(FILE * file, const char * format, ...)
int fprintf(FILE * file, const char * format, ...)
int main(int argc,const char *argv[])
{
int a, b;
fscanf(stdin, "%d%d", &a, &b);
fprintf(stdout, "a= %d b= %d\n", a, b);
FILE *pfile=NULL;
pfile = fopen("/Users/wangjunling/Desktop/file.rtf", "w");
if (pfile) {
printf("hello world\n");
fwrite("中国教育", sizeof("中国教育"), 1, pfile);
fclose(pfile);
}
return 0;
}
atoi
double atof(const char *);
int atoi(const char *);
long atol(const char *);
#include <stdlib.h>
int myatoi(const char *str)
{
int inter=1;
int number = 0;
while (isspace(*str))
{
str++;
}//跳过空字符
if (*str=='-') {
inter = -1;
}
if (*str=='-' || *str=='+') {
str++;
}
while (isdigit(*str)) {
number=number*10 + *str-'0';
str++;
}
return number;
}
int main(int argc,const char *argv[])
{
printf("%d\n", myatoi(" +34b456"));
printf("%f\n", atof("-3.145gt"));
return 0;
}
两字符串中第一个相同的子串(大于1个字符),并将子串输出
比如:
输入
adbAFEHHFS
acwfagAFEf
输出为
AFE
输入
qfdgJKlin
qdfgJKwfo
输出为
gJK
/*#include <string.h>
int main(int argc,const char *argv[])
{
char str1[100]={};
char str2[100]={};
int i=0;
char *pstr1 = NULL;
char *pstr2 = NULL;
scanf("%s %s", str1,str2);
int len1 = (int)strlen(str1);
int len2 = (int)strlen(str2);
for (i=0; i<len2-1; i++) {
pstr1 = (char *)memmem(str1, len1, &str2[i], 2);
if (pstr1) {
break;
}
}
pstr2 = &str2[i];
while (*pstr1 == *pstr2) {
pstr1++;
pstr2++;
}
*pstr2 = '\0';
printf("%s\n", &str2[i]);
return 0;
}*/
字符串拼接
实现一个函数,传递两个字符数组,利用指针将第二个数组中的字符,拼接到第一个字符数组尾部,并在main函数里输出。
比如:
输入:
hello
world
输出:helloworld
int main(int argc, const char *argv[])
{
char str1[50]={};
char str2[20]={};
scanf("%s%s",str1,str2);
int len1 = (int)strlen(str1);
int len2 = (int)strlen(str2);
for (int i=0;i<len2;i++) {
str1[i+len1]= str2[i];
}
str1[len1+len2]='\0';
printf("%s\n", str1);
return 0;
}
指针
基础知识
1.取地址符号: &
int a
&a 0xfff89900
2.指针 数据类型 + * + 标示符
指针变量:保存内存地址的变量空间
数据类型 + * +标示符
int *p char *pstr float *pf
int main(int argc, const char * argv[])
{
int a=10;
printf("%p\n", &a);
int *p = &a;
printf("%p\n", p);
*p = 20; *间接寻址符
printf("%d \n", *p);
*(int *)(0x7fff5fbff87c)=30;
printf("%d \n", a);
return 0;
}
3.64位系统指针变量在内存中占8字节空间
int main(int argc,const char *argv[])
{
printf("%lu\n", sizeof(char *));
printf("%lu\n", sizeof(int *));
printf("%lu\n", sizeof(float *));
printf("%lu\n", sizeof(long *));
return 0;
}
4 *和&一起使用
int a[6] int (*(&a))[6] int (*)[6]
int main(int argc, const char *argv[])
{
int a=10;
int *p=&a;
printf("%d \n", *(&a));
printf("%d \n", *p);
return 0;
}
5. NULL 空指针
(void *)0 泛型指针
#define NULL ((void *)0)
typedef (void *)0 NULL
int main(int argc,const char *argv[])
{
int a=40;
void *p= &a; int *(&a);
printf("%p\n", p);
printf("%p\n", &p);
p++;
printf("%p\n", p);
*(int *)p = 50;
printf("%d\n", *(int *)p);
return 0;
}
6.指针运算
1. ++ --
int main(int argc, const char * argv[])
{
int a=10;
int *p= &a;
printf("%p\n", p);
p++;
printf("%p\n", p);
p--;
printf("%p\n", p);
*p = 20;
printf("%d\n", a);
return 0;
}
2.地址相减:地址之差除指针数据类型的长度
int main(int argc,const char *argv[])
{
int a=10, b=20;
int *p,*q;
p = &a;
q = &b;
printf("p = %p\n", p);
printf("q = %p\n", q);
printf("%lu\n", p-q);
return 0;
}
int main(int argc, const char *argv[])
{
int a[10]={0};
int *p,*q;
p = &a[0];
q = &a[9];
printf("%ld\n", q-p);
return 0;
}
int main(int argc,const char *argv[])
{
char str[100]="hello world";
char *pstr = &str[4];
printf("%lu\n", pstr - str +1);
return 0;
}
3.指针不能进行加法运算
int main(int argc, const char *argv[])
{
int a,b;
int *p,*q;
p = &a;
q= &b;
printf("%p\n", p);
printf("%p\n", q);
printf("%p\n", p+q);
if (p>q) {
printf("a的地址比b的地址高\n");
}
else
{
printf("b的地址比a的地址高\n");
}
return 0;
}
4.指针常量
const
const+type+变量 type+const+变量
int main(int argc,const char *argv[])
{
char *str="hello world";
str = "qianfeng";
const char str[100]="hello world";
char str[100]="hello world";
*(str+2)='A';
printf("%s\n", str);
return 0;
}
#define LEN 10
int main(int argc,constchar *argv[])
{
const int a=10;
int const a=10;
a=20;
int *p = &a;
*p =20;
printf("%d\n", a);
printf("%d\n", *p);
printf("%p\n%p\n", &a, p);
printf("%d\n", 10);
return 0;
}
#endif
const 与 *
int main(int argc,const char *argv[])
{
int a=10;
int b=20;
argv[0] = &a;
const int *p=&a, *q=&b; *p *q不能被修改, p,q能被修改
*p = 50;
*q = 40;
const int *const p=&a,*q=&b; *p,p,*q不能被修改, q能被修改
*p=30;
p=&b;
*q = 79;
q= &a;
const int *p = &a; *p不可以修改 p可以被修改
*p = 20;
p= &b;
printf("%d\n", *p);
int * const p = &a; p不可以被修改, *p可以被修改
*p = 30;
p=&b;
printf("%d\n", *p);
const int *const p= &a; *p不能修改, p不能修改
*p = 90;
p = &b;
return 0;
}
7.数据类型分析
int a[10]
a[0]~~~a[9] 类型 int
int *p= &a[0] p的类型 int (*(&a[0])) ==> int *
int *p = a;
int [10] 类型 int *
int main(int argc, const char * argv[])
{
int a[10]={};
int (*p)[10]=&a;
printf("%p\n", p);
p++;
printf("%p\n", p);
return 0;
}
int a[3][5]
a &a &a[0] &a[0][0] a[0] a[0][0]
a: int [3][5] ==> int (*)[5]
&a: int (*(&a))[3][5] == > int (*)[3][5]
&a[0]: int a[0][5] ==> int (*(&a[0]))[5] ==> int (*)[5]
&a[0][0]: int *
a[0]: int a[0][5] ==> int [5] ==> int *
a[0][0]: int
int main(int argc,const char *argv[])
{
int a[3][5]={};
int (*p)[5] = &a[0];
int (*q)[3][5] = &a;
printf("%p\n", p);
printf("%p\n", q);
return 0;
}
8. 指针与数组
指针数组
int *a[10]
int main(int argc,const char *argv[]) {
char *ch[4]={"hello","world","qian","feng"};
for (int i=0; i<4; i++) {
printf("%s\n",ch[i]);
}
printf("\n");
return 0;
}
指针数组与二维数组
int sum_func(int *a[], int len1, int len2)
{
int sum=0;
for (int i=0; i<len1; i++) {
for (int j=0; j<len2; j++) {
sum+= *(*(a+i)+j);
}
}
return sum;
}
int main(int argc,const char *argv[])
{
int a[3][2]={1,2,3,4,5,6};
int *p[3]={NULL};
for (int i=0; i<3; i++) {
p[i]=a[i];
}
printf("sum = %d\n", sum_func(p,3,2));
return 0;
}
数组的指针
int (*p)[5]
int (*p)[2][3]
int (*p)[2][3][4]
int main(int argc,const char *argv[])
{
int a[2][3];
int (*p)[2][3] = &a;
int (*p[5])[2][3]
printf("%p\n", p);
p++;
printf("%p\n", p);
int b[2][3][4];
int (*q)[2][3][4] = &b;
printf("%p\n", q);
q++;
printf("%p\n", q);
return 0;
}
数组的指针与二维数组
int sum(int (*p)[2][3])
{
int sum = 0;
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
sum += (*p)[i][j];
sum += *(*(*p+i)+j); *p : int (*)[3]
*(*p+i)+j: ==> int [3]==> int *
}
}
return sum;
}
int sum2(int (*p)[3], int len)
{
int sum=0;
for (int i=0; i<len; i++) {
for (int j=0; j<3; j++) {
sum += *(*(p+i)+j);
}
}
return sum ;
}
int main(int argc,const char *argv[])
{
int a[2][3]={1,2,3,4,5,6};
printf("sum = %d\n", sum(&a));
return 0;
}
函数的指针
//int (*pfunc)(int, int)
int add(int a, int b)
{
return a+b;
}
int multi(int a, int b)
{
return a*b;
}
void print(int cnt)
{
for (int i=0; i<cnt; i++) {
printf("hello world\n");
}
}
int main(int argc,const char *argv[])
{
int (*pfunc)(int, int)= add;
printf("%d\n", add(10, 20));
printf("%d\n", pfunc(10,20));
pfunc = multi;
printf("%d\n", pfunc(10,20));
void (*qfunc)(int)=print;
qfunc(5);
return 0;
}
回调函数
void printhello(void)
{
printf("hello\n");
}
void printworld(void)
{
printf("world\n");
}
void print_welcome(void(*pfunc)(void),int times)
{
for (int i=0; i<times; i++) {
pfunc();
}
}
int main(int argc,constchar *argv[])
{
print_welcome(printhello, 5);
print_welcome(printworld, 5);
return 0;
}
指针与一维数组
利用指针,输入10个数到数组中,再输出
int main(int argc, const char * argv[])
{
int a[10];
int *p=a;
for (int i=0; i<10; i++) {
scanf("%d", p);
p++;
}
p=a;
for (int i=0; i<10; i++) {
printf("%d ", *p);
p++;
}
printf("\n");
return 0;
}
指针实现数组逆序
void reverse_arr(int *a, int len)
{
for (int i=0; i<len/2; i++) {
int temp = *(a+i);
*(a+i)= *(a+len-1-i);
*(a+len-1-i) = temp;
}
}
int main(int argc, const char *argv[])
{
int a[100];
int i,len;
for (i=0; i<100; i++) {
scanf("%d", &a[i]);
if (getchar()=='\n') {
break;
}
}
len = i+1;
reverse_arr(a, len);
for (i = 0; i<len; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
指针练习
编写函数 replace,在一个字符数组里面查找指定字符,并用相应的字符替代。函数原型如下:
void replace(char *array, char old, char new, int length)
#include <string.h>
char * replace(char *array,char old,char new,int length)
{
for (int i=0; i<length; i++) {
if (*(array+i)==old) {
*(array+i)= new;
}
}
return array;
}
int main(int argc,constchar *argv[])
{
char str[100];
scanf("%[^\n]", str);
printf("%s\n", str);
int len = (int)strlen(str);
replace(str, 'a', 'A', len);
printf("%s\n",replace(str, 'a', 'A', len));
/*gets(str);
printf("%s\n", str);
*/
/*scanf("%[A-Z,a-z,0-9]", str);
printf("%s\n", str);
*/
/*scanf("%[abcABC]",str);
printf("%s\n", str);
*/
return 0;
}
指针练习3
编写函数 insert,向一个字符数组指定位置插入一个字符,后面的字符依次向后移动。函数原型如下:
void insert(char *array, int index, char new, int length)
void insert(char *array,int index,char new,int length)
{
for (int i=length-1; i>=index; i--) {
*(array+i+1)= *(array+i);
}
*(array+index)= new;
}
int main(int argc,constchar *argv[])
{
char str[100];
scanf("%[^\n]", str);
printf("%s\n", str);
int len = (int)strlen(str);
insert(str, 5, 'A', len);
printf("%s\n",str);
return 0;
}
指针的数组(指针数组)
指针数组中的每个元素都是一个指针变量
int main(int argc, const char *argv[])
{
char *ch[5]={"hello one","hello two","hello three","hello four","hello five"};
for (int i=0; i<5; i++) {
printf("%s\n", ch[i]);
}
return 0;
}
指针数组与二维数组
int sum_func(int *a[], int len)
{
int sum=0;
for (int i=0; i<len; i++) {
sum += a[0][i];
sum += *(*a+i); a int ** *a int * **a int
}
return sum;
}
int sum_func(int *a[], int len1, int len2)
{
int sum=0;
for (int i=0; i<len1; i++) {
for (int j=0; j<len2; j++) {
sum += a[i][j];
sum += *(*(a+i)+j); *a int *
}
}
return sum;
}
int main(int argc,const char *argv[])
{
int a[3][2]={1,2,3,4,5,6};
int a[5]={1,2,3,4,5};
printf("%ld\n", sizeof(int **));
int *p[3]={NULL};
for (int i=0; i<3; i++) {
p[i]=a[i];
}
p[0]=a;
printf("sum = %d\n",sum_func(p,3,2));
return 0;
}
数组的指针与二维数组
int sum(int (*p)[2][3])
{
int sum = 0;
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
sum += (*p)[i][j];
sum += *(*(*p+i)+j); *p : int (*)[3]
*(*p+i)+j: ==> int [3]==> int *
}
}
return sum;
}
int sum2(int (*p)[3],int len)
{
int sum=0;
for (int i=0; i<len; i++) {
for (int j=0; j<3; j++) {
sum += *(*(p+i)+j);
}
}
return sum ;
}
int main(int argc,constchar *argv[])
{
int a[2][3]={1,2,3,4,5,6};
printf("sum = %d\n", sum(&a));
return 0;
}