1.得到printf的缓冲区

从缓冲区输出条件

  • 缓冲区填满
  • 写入字符中含有'\n','\r'
  • 调用fflush或者stdout等手动刷新缓冲区
  • 调用scanf、gets等从缓冲区获取数据的函数
  • 程序结束时

Code

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    char a ='*';
    if(argc != 2) {
        puts("argc error");
        return 0;
    }
    for(int i=0; i < atoi(argv[1]); i++) {
        printf("%c",a);
    }
    while(1);
}

然后我们通过手动二分的方式就能知道其实prinf的缓冲区大小位1024字节
如图:

2.判断三角形类型

类型

  • 是否是三角形
  • 等边三角形
  • 直角三角形
  • 钝角三角形
  • 锐角三角形
  • 等腰三角形
    • 直角等腰三角形
    • 锐角等腰三角形
    • 钝角等腰三角形

Code

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

int check(int a,int b,int c){
    if(a + b > c || a + c > b || b + c > a) return 0;
    return 1;
}

int check_tri(int a,int b,int c) {
    if(a * a + b  * b == c * c) return 1;
    else if(a * a + b * b > c * c) return 2;
    else if(a * a + b * b < c * c) return 3;

}

void work(int a,int b,int c) {
    int kind = check_tri(b,c,a);
    if(kind == 1) {
        if(b == c || b == a || c == a) puts("等腰直角三角形");
        else puts("直角三角形");
     }
     else if(kind == 2) {
         if(b == c|| b == a || c == a) puts("等腰钝角三角形");
         else puts("钝角三角形");
      }
      else if(kind == 3) {
          if(b == c|| b == a || c == a) puts("等腰锐角三角形");
          else puts("锐角三角形");
      }
}

int main(){
    int a,b,c;
    printf("请输入三角形的三边:\n");
    scanf("%d%d%d",&a,&b,&c);
    if(check(a,b,c)){
        puts("不是三角形");
    }
    else{
        int kind;
        if(a == b && a == c){
            puts("等边三角形");
            return 0;
        }
        if(a >= b && a >= c) {
            work(a,b,c);
        }
        else if(b >= a && b >= c) {
            work(b,a,c);
        }
        else if(c >= a && c >= b) {
            work(c,a,b);
        }
        /*else {
            puts("等边三角形");
        } */
    }
    return 0;
}

3.将整型转化为字符型,将字符型转化为整型

思路

  • 我们先定义一个int类型,然后给他随便赋一个值
  • 我们再定义一个char*的指向int的首地址
  • 然后我们再通过指针往后移的操作来访问int里面的每个字节
  • 最后讲char类型的强转为int类型即可

Code

#include<stdio.h>
#include<string.h>

int main(){
    int n = 0x12345678;
    char *p = &n;
    for(int i = 0;i < 4; ++i,p++) {
        printf("%d\n",(int)*p);
    }
    return 0;
}

关于输出

这里输出的是

120
86
52
18

说明这里是小端模式,我们的数据低位在地址低位即

120 = 0x78;
86  = 0x56;
52  = 0x34;
18  = 0x12;

4.打印图案

思路

二层循环直接输出即可

Code

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

int main(int argc,char **argv){
    if(argc != 2){
        printf("error");
        return 0;
    }
    int n = atoi(argv[1]);
    for(int i = 1;i <= n; ++i) {
        for(int j = 1;j <= i; ++j){
            printf("*%c",j==i?'\n':' ');
        }
    }
    return 0;
}

5.SWAP

说明

  • 以前我们通过定义一个零时变量可以写出这个函数
  • 现在要求是不用零时变量,那么应该怎么做呢
  • 这里我们可以运用二进制的位运算特性
  • 前置知识是^:a ^ a = 0
  • 第一步我们通过a = a^b;//此时 a = a ^ b,b = b;
  • 第二步我们通过b = a ^ b;//此时的b = a ^ b ^ b => a;
  • 第三步我们通过a = a ^ b;//此时的a = a ^ b ^ a => b;
    这样我们就通过异或的操作实现了数据互换

Code

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

void swap(int *a,int *b){
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

int main(){
    int a,b;
    printf("请输入a和b\n");
    scanf("%d%d",&a,&b);
    swap(&a,&b);
    printf("a = %d b = %d\n",a,b);
    return 0;
}

本当の声を響かせてよ