c学习 (持续更新)

learn c

1.你好世界
#include<stdio.h>
int main(){
      printf("hello world\n");
      return 0;
}
2.1.输入两数互相减必须整数
#include<stdio.h>
int main()
{   int a=0;
    int c=0;
    scanf("%d %d",&a,&c);
    int e=a-c;
    printf("%d",e);
    
    

    return 0;

}
2.2.输入两数互相减可以小数
#include<stdio.h>
int main()
{   double a=0;
    double c=0;
    scanf("%lf %lf",&a,&c);
    double e=a-c;
    printf("%f",e);
 
 
    return 0;

}
3.输入三位数然后倒过来
#include<stdio.h>
int main()
{   int a=443;
    printf("现在你来输入一个三位数吧\n");
    scanf("%d", &a);
    int c=(a/100);
    int e=(a-100*c)/10;
    int u=(a-100*c-10*e);

    int p=u*100+e*10+c;
    printf("%d\n",p);
    return 0;
}

3.输入三位数然后倒过来2
#include<stdio.h>
int main()
{   int a=443;
    printf("三位数\n");
    scanf("%d", &a);
    if (a>999)
    {printf("这是三位数?太大了");
    }
    if (a<0)
    {printf("负数了"); 
    }
    if (a>0&&a<99)
    {
    int c=(a/100);
    int e=(a-100*c)/10;
    int u=(a-100*c-10*e);

    int p=u*100+e*10+c;
    printf("%d\n",p);
	}
    return 0;
}

4.判断数字位数
#include<stdio.h>
int main()
{   int a;
    int n=0;
    scanf("%d",&a);
    n=n+1;
    a/=10;
    while (a>0)
    {
        n++;
        a=a/10;
    }
    printf("%d",n);
    return 0;
}

4.判断数字位数2
#include<stdio.h>
int main()
{   int a;
    int n=0;
    scanf("%d",&a);
    do
    {   n=n+1;
        a/=10;
    
    } while (a>0);
    
    printf("%d",n);
    return 0;
}

4.判断数字位数3
#include<stdio.h>
int num,a;
int main()
{
    scanf("%d",&num);
    do 
    {
        num=num/10;
        a++;
    }while(num>0);
    printf("%d",a);
}
5.计算阶乘
#include<stdio.h>
int main()
{   int a;
    printf("我会帮你计算___的阶乘\n");
    scanf("%d",&a);
    int b=1;
    int c=1;
    if (a<0)
    {
        printf("上课听讲了嘛你阶乘就负数");
        return 1;
    }
    
    if (a>1)
    {while (c<=a)
        {
            b*=c;
            c=c+1;
        }
    }else{
        printf("这是特殊的!长大以后再来学习吧,可以先告诉你答案\n");
    }
    
    printf("%d!=%d\n",a,b);
    
    return 0;
}
5.计算阶乘2
#include<stdio.h>
int main()
{   int a;
    printf("我会帮你计算___的阶乘\n");
    scanf("%d",&a);
    int b=1;
    if (a<0)
    {
        printf("上课听讲了嘛你阶乘就负数");
        return 1;
    }
    
    if (a>1)
    {for (int c=1; c<=a; c++)
    {
        b*=c;
    }
    
    }else{
        printf("这是特殊的!\n");
    }
    
    printf("%d!=%d\n",a,b);
    
    return 0;
}
5.计算阶乘3
int jcheng(int a)
{
    if(a<=1)
    {
        return 1;
    }else
    {
        return a*jcheng(a-1);
    }
}
6.一二一二,一往前站,罗列序号
#include<stdio.h>
int main()
{   int a;
    printf("班上有多少人?我将为你列举站在第一排的学生序号。\n");
    scanf("%d",&a);
    for ( int i = 1; i <= a; i=i+2)
        {
            printf("%d ",i);
        }
   
    return 0;
}
7.跟10比大小
#include<stdio.h>
#include<stdbool.h>
int main()
{   int a;
    int b=10;
    scanf("%d",&a);
    a>b?printf("1"):printf("2");
    return 0;
}
8.判断正负
#include<stdio.h>
#include<stdbool.h>
int main()
{   int a;
    printf("我可以判断正负\n");
    scanf("%d",&a);
    if (a>0){
        printf("正数\n");
    }
    else if (a<0){
        printf("负数\n");
    }
    else if (a=0){
        printf("是0哦\n");
    }
    else{
        printf("请输入数字哦\n");
    }
    return 0;
}
9.五以内的正整数加二
#include<stdio.h>
#include<stdbool.h>
int main()
{   int a;
    printf("给我一个五以内的正整数,我可以告诉你这个数加二等于多少\n");
    scanf("%d",&a);
    switch (a){
    case (0):
    case (-1):
        printf("这不是正整数哦");
        break;    
    case (1):
        printf("是3");
        break;
    case (2):
        printf("是4");
        break;
    case (3):
        printf("是5");
        break;
    case (4):
        printf("是6");
        break;
    case (5):
        printf("是7");
        break;    
    
    default:
        printf("请输入五以内的正整数哦");
        break;
    }
    return 0;
}
10.算1加到n
#include<stdio.h>
#include<stdbool.h>
int main()
{   int a;
    int b=0;
    int c=0;
    printf("算整数1到前n项的和\n");
    scanf("%d",&a);
    while (a>0)
    {
        b+=a;//b+=a = b=a+b
        a--;
        c++;
    }

    printf("%d",b);
    
  
    return 0;
} 
10.算1加到n2
#include<stdio.h>
#include<stdbool.h>
int main()
{   int a;
    int b=0;
    int c=0;
    printf("算整数1到前n项的和\n");
    scanf("%d",&a);
    double d=(a+1)*a/2;
    printf("%f",d);
    // 数学的魅力啊!
  
    return 0;
} 
11.100以内猜数字
#include<stdio.h>

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

int main()
{//随机生成一个一百以内的数字
    srand(time(0));
    int a=rand();
    int b=a%100+1;
    int c=0;
    int d=0;
    printf("我已经想好了一个1~100的数字\n");
    do
    {
        printf("请猜猜这个数字吧\n");
        scanf("%d",&c);
        d++;
        if (c>b)
        {
            printf("你猜的数字大了,再试试吧");
        }
        else if (c<b)
        {
            printf("你猜的数字小了,再试试吧");
        }
        
    } while (c!=b);
    printf("天,太棒了哥们,你只用了%d次数就猜到了答案\n",d);
    

    return 0;
} 
11.1猜数字(自定义版本)
#include<stdio.h>

int main()
{
    int realnum=123;
    int guessnum;
    int a=0;

    printf ("now,we have number now!\n") ;

    do
    {
        printf ("have a guess!\n");
        scanf ("%d",&guessnum) ;
        a++;
        if (guessnum>realnum)
        {
            printf("too much\n");
        }
        else if (guessnum<realnum)
        {
            printf("too little\n");
        }
    } while (guessnum!=realnum&&a<5);

    if (a<5&&a>=1)
    {
        printf("great job!\nyou succeeded in just %d attempts",a);
    }else
    {
        printf("you lose\n");
    }

    return 0;
}
12.判断素数
#include<stdio.h>

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

int main()
{
    int a;
    int b;
    int c=1;
    printf("我会帮你判断____是否是素数\n");
    scanf("%d",&a);
    for (b=2; b < a; b++)
    {
        if (a%b==0)
        {
            c=0;
            break;
        }
    }
    if (c==1)
    {
        printf("是素数");
    } else{
        printf("不是素数");
    }
    return 0;
} 
13.判断多少以内的所有素数
#include<stdio.h>

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

int main()
{
    int a;
    int b;
    int d;
    printf("我会帮你输入____之前的所有素数\n");
    scanf("%d",&d);
    for ( a=2; a <d; a++)
    {
        int c=1;
        for (b=2; b < a; b++)
    {
        if (a%b==0)
        {
            c=0;
            break;
        }
    }
    if (c==1)
    {
        printf("%d\n",a);
    } 
    }
    
    
    return 0;
} 
14.判断前多少个素数
#include<stdio.h>

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

int main()
{
    int a=2;
    int b;
    int d;
    printf("我会帮你输入前____个素数\n");
    scanf("%d",&d);
    //for ( a=2; a <d; a++)
    int e=0;
    while (e<d)   
    {
        int c=1;
        for (b=2; b < a; b++)
    {
        if (a%b==0)
        {
            c=0;
            break;
        }
    }
    if (c==1)
    {
        printf("%d\n",a);
        e++;
    } 
    a++;
    }
    
    
    return 0;
} 
14.判断前多少个素数2
#include<stdio.h>

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

int main()
{
    int a=2;
    int b;
    int d;
    printf("我会帮你输入前____个素数\n");
    scanf("%d",&d);
    //for ( a=2; a <d; a++)
    int e=0;
    for ( a=2; e < d; a++)  
    {
        int c=1;
        for (b=2; b < a; b++)
    {
        if (a%b==0)
        {
            c=0;
            break;
        }
    }
    if (c==1)
    {
        printf("%d\n",a);
        e++;
    } 
    }
    
    
    return 0;
} 
15.1.1除以n的前n项和
#include<stdio.h>

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

int main()
{
    int a;
    int b;
    double c=0.0;
    printf("f(n)=1/1+1/2+1/3+1/4+...1/n,输入n\n");
    scanf("%d",&a);
    for ( b = 1; b <= a; b++)
    {
        c+=1.0/b;
    }
    printf("f(n)=%f\n",c);
    return 0;
} 
15.2.正负1除以n的前n项和
#include<stdio.h>

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

int main()
{
    int a;
    int b;
    double c=0.0;
    int d=1;
    printf("f(n)=1/1-1/2+1/3-1/4+...1/n,输入n\n");
    scanf("%d",&a);
    for ( b = 1; b <= a; b++)
    {
        c+=d*1.0/b;
        d=-d;
    }
    printf("f(n)=%f\n",c);
    return 0;
} 
16.找两个数的最大公约数(枚举法)
#include<stdio.h>

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

int main()
{
    int a,b;
    int min;
    printf("输入两个数中间用“ ”间隔开\n");
    scanf("%d %d",&a,&b);
    if (a>b)
    {
        min=b;
    }else{
        min=a;
    }
    int c=1;
    int i;
    for ( i = 1; i <= min; i++){
        if (a%i==0){
            if (b%i==0){
                c=i;
            }
        }
    }
    printf("%d和%d的最大公约数为%d",a,b,c);

    return 0;
} 
16.找两个数的最大公约数(辗转相除法)
#include<stdio.h>

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

int main()
{
    int a,b;
    printf("输入两个数中间用“ ”间隔开\n");
    scanf("%d %d",&a,&b);
    int c;
    int d;
    while (b!=0)
    {
        d=a%b;
        a=b;
        b=d;
    }
    c=a;
    printf("最小公约数为%d",c);

    return 0;
} 
17.1.输入任意多位数,倒过来展现(3.的进阶)
#include<stdio.h>

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

int main()
{
    int a;
    scanf("%d",&a);
    do
    {
        int b=a%10;
        printf("%d ",b);
        a/=10;

    } while (a>0);
    printf("\n");
    return 0;
} 
17.2.输入任意多位数,正着展现
#include<stdio.h>

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

int main()
{
    int a;
    int b=1;
    int c=1;
    printf("输入一个数字吧\n");
    scanf("%d",&a);
    int d=a;
    while (d>9)
    {
        d/=10;
        b++;
        c*=10;
    } 
    printf("这是%d位数\n",b);
    do
    {
        int e=a/c;
        printf("%d",e);
        if (c>1)
        {
            printf(" ");
        }
        a%=c;
        c/=10;
    } while (c>0);
    printf("\n");
    return 0;
} 
18.算平均数
#include<stdio.h>

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

int main()
{
    int a;
    double b=0;
    int c=0;
    printf("我将为你计算所有数字的平均数\n中间用“ ”间隔开来,输入“-1”时候,为你输出平均数\n");
    scanf("%d",&a);
    while (a!=-1)
    {
        b+=a;
        c++;
        scanf("%d",&a);
    }
    if (c>0)
    {
        printf("你总共输入了%d个数,他们的平均数是%f",c,b/c);
    }
    
    return 0;
} 
19.统计1~9的整数的个数
#include<stdio.h>

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

int main()
{
    const int num=10;
    int a;
    int count[num];
    int i;
    for ( i = 0; i < num; i++)
    {
        count[i]=0;
    }
    scanf("%d",&a);
    while (a!=-1)
    {
        if (a>=0&&a<=9)
        {
            count[a]++;
        }
        scanf("%d",&a);
    }
    for ( i = 0; i < num; i++)
    {
        printf("%d:%d\n",i,count[i]);
    }
    

    return 0;
} 
20.计算两数之间所有数之和
#include<stdio.h>

#include<stdlib.h>
#include<time.h>
void sum(int a,int b)
{
    int i;
    int sum=0;
    for ( i = a; i<=b ; i++)
    {
        sum+=i;
    }
    printf("从%d加到%d等于%d",a,b,sum);
}

int main()
{
    int c,d;
    printf("输入两个数字我会为你计算这两个数之间所有数的和,两数之间用“,”连接\n");
    scanf("%d,%d",&c,&d);
    sum(c,d);
    return 0;
} 
21.前多少数的素数表
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
int main(void)
{ 
    const int maxnum=25;//修改的地方
    int prime[maxnum];
    int i;
    int x;
    for ( i = 0; i < maxnum; i++)
    {
        prime[i]=1;
    }
    for ( x = 2; x < maxnum; x++)
    {
        if (prime[x])
        {
            for ( i = 2; i*x < maxnum; i++)
            {
                prime[i*x]=0;
            }
            
        }
        
    }
    for ( i = 2; i < maxnum; i++)
    {
        if (prime[i])
        {
            printf("%d\t",i);
        }
        
    }
    printf("\n");
    return 0;
}
22.给与数组,然后线性搜索
#include<stdio.h>
#include<math.h>

int search(int key,int a[],int len)
{
    int ret=-1;
    for ( int i = 0; i < len; i++)
    {
        if (key==a[i])
        {
            ret=i;
            break;
        }
    }
    return ret;
}

int main()
{
    printf("数列1,2,3,5,6,5,121,38,12,34,23中我可以告诉你这个数字是第几个\n");
    int a;
    int abc[]={1,2,3,5,6,5,121,38,12,34,23};
    scanf("%d",&a);
    int r=search(a,abc,sizeof(abc)/sizeof(abc[0]));
    if (r!=-1)
    {printf("这是数列的第%d个\n",r);
    }
    else printf("这个数字不在数列中哦\n");
    
}
23.数字美分和英文一一对应
#include<stdio.h>
#include<math.h>

int amount[]={1,5,10,25,50};
char *name[]={"penny","nickel","dime","quarter","half-doller"};

int search(int key,int a[],int len)
{
    int ret=-1;
    for ( int i = 0; i < len; i++)
    {
        if (key==a[i])
        {
            ret=i;
            break;
        }
    }
    return ret;
}

int main()
{
    printf("我可以告诉你1,5,10,25,50美分的英文哦\n");
    int a;
    scanf("%d",&a);
    int r=search(a,amount,sizeof(amount)/sizeof(amount[0]));
    if (r!=-1)
    {
        printf("%s\n",name[r]);
    }
    else printf("你的%d美分太零碎啦\n",a);
    
}
23.数字美分和英文一一对应2
#include<stdio.h>
#include<math.h>

/*
int amount[]={1,5,10,25,50};
char *name[]={"penny","nickel","dime","quarter","half-doller"};
*/
struct 
{
    int amount;
    char *name;
}miao[]={
    {1,"penny"},
    {5,"neckel"},
    {10,"dime"},
    {25,"quarter"},
    {50,"half-doller"},
};

int search(int key,int a[],int len)
{
    int ret=-1;
    for ( int i = 0; i < len; i++)
    {
        if (key==a[i])
        {
            ret=i;
            break;
        }
    }
    return ret;
}

int main()
{
    printf("我可以告诉你1,5,10,25,50美分的英文哦\n");
    int a;
    scanf("%d",&a);
    //int r=search(a,amount,sizeof(amount)/sizeof(amount[0]));
    for ( int i = 0; i < sizeof(miao)/sizeof(miao[0]);i++)
    {
        if (a==miao[i].amount)
        {
            printf("%s\n",miao[i].name);
            break;
        }   
    }
    return 0;
}
24.二分法
#include<stdio.h>
#include<math.h>


int search(int key,int a[],int len)
{
    int ret=-1;
    int left=0;
    int right=len-1;
    while (right >left)
    {
        int mid=(left + right)/2;
        if (a[mid]==key)
        {
            ret=mid;
            break;
        }
        else if (a[mid]>key)
        {
            right=mid-1;
        }
        else
        {
            left=mid+1;
        }
        return ret;
    }
}


int main()
{
    return 0;
}
25.选择排序
#include<stdio.h>
#include<math.h>

int search(int key,int a[],int len)
{
    int ret=-1;
    int left=0;
    int right=len-1;
    while (right >left)
    {
        int mid=(left + right)/2;
        if (a[mid]==key)
        {
            ret=mid;
            break;
        }
        else if (a[mid]>key)
        {
            right=mid-1;
        }
        else
        {
            left=mid+1;
        }
        return ret;
    }
}//二分法,但是这个的前提是有序排序,所以这个时候需要排序

int max(int a[],int len)
{
    int maxid=0;
    for (int i = 1; i < len; i++)
    {
        if (a[i]>a[maxid])
        {
            maxid=i;
        }
        
    }
    return maxid;
    
}

int main()
{
    int abc[]={1,2,3,5,6,5,121,38,12,34,23};
    int len=sizeof(abc)/sizeof(abc[0]);
for ( int i = len-1; i > 0; i--)
{
    int maxid=max(abc,i+1);

    int t=abc[maxid];
    abc[maxid]=abc[i];
    abc[i]=t;
}
//输出
for ( int i = 0; i < len; i++)
{
    printf("%d ",abc[i]);
}


    return 0;
}

//int abc[]={1,2,3,5,6,5,121,38,12,34,23};
//sizeof(abc)/sizeof(abc[0])
26.显示地址
#include<stdio.h>
#include<math.h>

int main()
{
    int i=0;
    int p;
    p=(int)&i;
    printf("%p\n",p);
    printf("%x\n",&i);    
    printf("%p\n",&i);
    printf("%p\n",&p);
    printf("%lu\n",sizeof(int));
    printf("%lu\n",sizeof(i));
    return 0;
}

27.定义地址
#include<stdio.h>
#include<math.h>

int main()
{
    int i=0;
    int *p=&i;
    scanf("%d",p);
    printf("%d\n",i);
    return 0;
}

28.定义字符
#include<stdio.h>

int main()
{
    char a;
    scanf("%c",&a);
    printf("a=%d\n",a);
    printf("a='%c'\n",a);

    return 0;
}

29.字符串函数(40.-43.目录)
#include<stdio.h>
#include<string.h>

int main()
{
    char line[]="Hello!";
    char a[]="abc";
    char b[100];
    //strlen(line)告诉字符有多长
    printf("strlen=%d\n",strlen(line));
    printf("sizeof=%d\n",sizeof(line));
    //strcmp比大小 ,并且显示差值
    printf("strcmp=%d\n",strcmp(line,a));
    //strcpy誊抄
    //安全版本是 strncpy ,size_t n
    strcpy(b,line);

    printf("b=%s\n",b);
    //strcat连接
    //安全版本是 strncat ,size_t n
    printf("strcat=%d\n",strcat(a,b));//不一样的!!%d是地址%s是字符串!!
    printf("strcat=%s\n",strcat(a,b));

    //strchr从左寻找
    //strrchr从右寻找
    return 0;
}

30.用指针换两个数字
#include<stdio.h>
#include<string.h>
void swap(int *a,int *b);

int main(void){
    int a=1;
    int b=2;
    printf("%d,%d",a,b);
    swap(&a,&b);
    printf("%d,%d",a,b);
}

void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;
}
31.除法
#include<math.h>
#include<stdio.h>
//如果除法成功,返回1,否则返回0
int divide(int a,int b,int *result);

int main (void){
    int a,b,c;
    printf("输入a和b,中间用“ ”分开,我会为你计算出a/b: \n");
    scanf("%d %d",&a,&b);

    if (divide(a,b,&c))
    {
        printf("%d/%d=%d\n",a,b,c);
    }
    
    return 0;

}

int divide(int a,int b,int *result)
{
    int ret = 1;
    if (b==0)
    {
        ret = 0;
    }else{
        *result = a/b;
    }
    return ret;
}
32.指针计算
#include<math.h>
#include<stdio.h> 
int main (viod)
{
    char ac[] = {0,1,2,3,4,5,6,7,8,9,};
    char *p = ac;
    char *p1 = &ac;
    char *p2 = &ac[6];
    printf("p = %p\n",p);
    printf("p+1 = %p\n",p+1);
    printf("*(p+1) = %d\n",*(p+1));
    printf("p1-p2= %d\n",p1-p2);

    /*
    *p->ac[0]
    *(p=1)->ac[1]
    
    *(p+n)==ac[n]
    */

    int ad[] = {0,9090,2,3,4,5,6,7,8,9,};
    int *b = ad;
    int *b1 = &ad[1];
    int *b2 = &ad[2];
    printf("b = %p\n",b);
    printf("b+1 = %p\n",b+1);
    printf("*(b+1) = %d\n",*(b+1));
    printf("b1-b= %d\n",b1-b);
    printf("b2-b= %d\n",b2-b);


    return 0;
}
33.指针展示
#include<math.h>
#include<stdio.h> 
int main (viod)
{
    char ac[] = {0,1,2,3,4,5,6,7,8,9,-1,};
    char *p = &ac;
    int i;
    for ( i = 0; i < sizeof(ac)/sizeof(ac[0]); i++)
    {
        printf("%d\n",ac[i]);
        /* code */
    }
    
    for ( p=ac; *p!=-1; p++)
    {
        printf("%d\n",*p);
        /* code */
    }
    
    for ( p=ac; *p!=-1;)
    {
        printf("%d\n",*p++);
        /* code */
    }

    while (*p!=-1)
    {
        printf("%d\n",*p++);
        /* code */
    }
    

    int ad[] = {0,9090,2,3,4,5,6,7,8,9,};
    int *b = ad;
   
    return 0;
}
34.自定义数组长度
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

int main (viod)
{
    int num;
    int* a;
    int i;
    printf("输入数量:");
    scanf("%d",&num);

    //int a[num];
    a = (int*)malloc(num*sizeof(int));
    for ( i = 0; i < num; i++)
    {
        scanf("%d",&a[i]);
        /* code */
    }
    for ( i = num-1; i >= 0; i--)
    {
        printf("%d",a[i]);
        /* code */
    }
    free(a);
    
    return 0;
}
35.借空间
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

int main (viod)
{
    void *p = 0;
    int a = 0;
    while ((p=malloc(100*1024*1024)))
    {
        a++;
    }
    printf("分配了%d00MB的空间\n",a);
    //free(NULL);
    free(p);
    return 0;
}
36.复述 EOF
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

int main (int argc,char const *argv[])
{
    int ch;
    while ((ch= getchar())!=EOF)
    {
        putchar(ch);
        /* code */
    }
    
    /*
    windows是
    输入ctrl+z是输入结束
    输入ctrl+c是强制结束程序
    linux是
    输入ctrl+d是输入结束
    输入ctrl+c是强制结束程序
    */

    printf("EOF\n");

    return 0;
}
37.字符串数组
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

int main (void)
{

    char *a[] = {
        "Hello",
        "world",
        "asdfghjklzxcvbnm",
    };

    char b[][10] = {
        "Hello",
        "world",

    };

    return 0;
}
38.main里有啥
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

int main (int argc,char const *argv[])
{
    for ( int i = 0; i < argc; i++)
    {
        printf("%d:%s\n",i,argv[i]);
    }
    
    return 0;
}
39.用字符串数组表示月份(9.和23.的进阶)
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

int main (void)
{
    printf("请输入月份:");
    int i ;
    scanf("%d",&i);

    char *month []=
    {
        "January\n",
        "February\n",
        "March\n",
        "April\n",
        "May\n",
        "June\n",
        "July\n",
        "August\n",
        "September\n",
        "October\n",
        "November\n",
        "December\n",

    };

    printf("%s\n",month[i-1]);

    /*
    if (i >= 1 && i <= 12) {
        printf("%s\n", month[i - 1]);
    } else {
        printf("输入无效!请输入1到12之间的数字。\n");
    }*/

    return 0;
}
40.获取长度
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

#include<string.h>

int mylen(const char *s)
{
    //int cnt = 0;
    int idx = 0;
    while (s[idx] != '\0')
    {
        idx++;
        //cnt++;
    }
    //return cnt;
    return idx;
}

int main (int argc,char const *argv[])
{
    char line []="Hello";
    printf("strlen=%lu\n",strlen(line));//计算长度
    printf("strlen=%lu\n",mylen(line));
    printf("sizeof=%lu\n",sizeof(line));
    
    return 0;
}
41.比字符串大小
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

#include<string.h>
/*
int mycmp(const char *s1,const char *s2)
{
    int idx = 0;
    while (s1[idx]==s2[idx] && s1[idx]!='\0')
    {
    //while (1)
    //{
        //if (s1[idx]!=s2[idx])
        //{
        //    break;
        //}
        //else if (s1[idx]=='\0')
        //{
        //    break;
        //}
        idx++;
    }

    return s1[idx]-s2[idx];
}
*/
int mycmp(const char *s1,const char *s2)
{
    int idx = 0;
    while (*s1==*s2 && *s1!='\0')
    {
        s1++;
        s2++;
    }

    return *s1-*s2;
}

int main (int argc,char const *argv[])
{
    char s1[]="abc";
    
    char s2[]="bbc";
    char s3[]="Abc";
    char s4[]="abc ";
    printf("%d\n",strcmp(s1,s1));//si==s2 0
    printf("%d\n",strcmp(s1,s2));//si<s2 -1
    printf("%d\n",strcmp(s1,s3));//si>s2 1
    printf("%d\n",strcmp(s1,s4));

    printf("%d\n",mycmp(s1,s1));//si==s2 0
    printf("%d\n",mycmp(s1,s2));//si<s2 -1
    printf("%d\n",mycmp(s1,s3));//si>s2 1
    printf("%d\n",mycmp(s1,s4));
    printf("%d\n",'a'-'A');
    
    return 0;
}
42.复制
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

#include<string.h>

//1

/*
int *mycpy(char *dst ,char *src)
{
    int idx = 0;
    while (src[idx]!='\0')
    {
        dst[idx]=src[idx];
        idx++;
    }
    dst[idx]=src[idx];
    dst[idx]='\0';
    return dst;
}
*/

//2

/*
int *mycpy(char *dst ,char *src)
{
    int idx = 0;
    while (src[idx])
    {
        dst[idx]=src[idx];
        idx++;
    }
    dst[idx]=src[idx];
    dst[idx]='\0';
    return dst;
}
*/

//3

/*
int *mycpy(char *dst ,char *src)
{
    char *ret=dst;
    while (*src!='\0'){
        *dst=*src;
        dst++;
        src++;
    }
    *dst='\0';
    return ret;
}
*/

int *mycpy(char *dst ,char *src)
{
    char *ret=dst;
    while (*dst++=*src++);
    *dst='\0';
    return ret;
}

int main (int argc,char const *argv[])
{
    char s1[]="abc";
    char s2[]="abc";
    strcpy(s1,s2);

    return 0;
}
43.找字符
#include<math.h>
#include<stdio.h> 
#include<stdlib.h>

#include<string.h>

int main (int argc,char const *argv[])
{
    char s[]="hello";
    char *p=strchr(s,'l');
    char c=*p;
    *p='\0';
    p=strchr(p+1,'l');
    char *t=(char*)malloc(strlen(s)+1);
    strcpy(t,p);
    //printf("%s\n",p);
    printf("%s\n",s);
    free(t);
    return 0;
}
44.找字符串
#define _GNU_SOURCE//特殊分大小写前置

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


#include<string.h>
#include <strings.h>//特殊分大小写(但是vs好像不支持strcasestr)

char *my_strcasestr(const char *a, const char *b) {
    size_t n = strlen(b);
    while (*a) {
        if (strncasecmp(a, b, n) == 0)
            return (char *)a;
        ++a;
    }
    return NULL;
}



int main (void)
{
    char s[]="helloWorld";
    char a[]="owo";

    char *p1=strstr(s,a);
    //char *p2=strcasestr(s,a);
    char *p2=my_strcasestr(s,a);


    //p1=strstr(p1+1,s);//找多个,确定至少有一个
    //printf("%s\n",p1);

    if (p1) //判断存在
     {
        printf("在 %ld\n", p1 - s);
     } 
    else 
     {
        printf("'%s'没找到捏\n", a);
     }

    //p2=strcasestr(p2+1,s);//必须是p != NULL
    //printf("%s\n",p2);

    if (p2) //判断存在
     {
        printf("在 %ld\n", p2 - s);
     } 
    else 
     {
        printf("'%s'没找到捏\n", a);
     }

    return 0;
}
45.二维数组转一维(纵向左到右)
#include<stdio.h>

void num(const int*a,int b,int c,int d[])
{
//a 是首项元素,b 是行,c 是列
    for (int j=0;j<c;++j)
        for (int i=0;i<b;++i)
        {
            *d++=a[i*c+j];
        }
}
int main()
{
    int e[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int f[100];
    num(&e[0][0],4,3,f);
    for (int i=0;i<12;++i)
    {
    printf("%d",f[i]);
    }
    return 0;
}
46.输入任意多位数,倒过来展现(3.的进阶)(17.1.的进阶)
#include<stdio.h>

int main()
{
    int a;
    scanf("%d", &a);
    int c=0;
    do {
        int b=a%10;
        if (b!=0||c) 
        {
            printf("%d",b);
            c=1;
        }
        a/=10;
    } while (a>0);
    if (!c) 
    {
        printf("0");
    }
    return 0;
}
47.次方(次幂)函数
int cifang(int a,int b){
  int c=1;
  for(int i=1;i<=b;i++){
		c*=a;
  }
  return c;
}
48.比大小(冒泡排序)
#include<stdio.h>

int main()
{
    int itoio[10]={0};
    //输入十个数字
    printf("write ten num(each number is separated by ',' :\n");
    for ( int i = 0; i < 10; i++)
    {
        scanf("%d,",&itoio[i]);
    }

    //比大小

    //int itoio[10]={12,51,3,12,36,98,74,15,54,20};

    int a,b,c;

    for ( a = 0; a < 10-1; a++)
    {
        for ( b = 0; b < 10-1-a; b++)
        {
            if (itoio[b]>itoio[b+1])
            {
                c=itoio[b];
                itoio[b]=itoio[b+1];
                itoio[b+1]=c;
            }
        }
    }
    
    for ( int i = 0; i < 10; i++)
    {
        printf("%d ",itoio[i]);
    }
    
    printf("\n");
    
    return 0;
}