整理之前写过的小代码,测试代码

1.对于这个程序测试环境是redhat7.0,编译器用的是gcc,主要是熟悉一下如何使用linux下的这些函数,如何使用man自己查阅

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>

void print_week(int );        //输出周
void print_annimal_year(int); // 输出生肖年


void print_week(int num)
{
   switch(num){
     case 1 : printf(" Mon");
              break;
     case 2 : printf(" Tus");
              break;
     case 3 : printf(" Wes");
              break;
     case 4 : printf(" Tue");
              break;
     case 5 : printf(" Fri");
              break;
     case 6 : printf(" Sau");
              break;
     case 7 : printf(" Sun");
              break;
   }
}

void print_annimal_year (int num)
{
       int annimal = (num - 1970)%12;
       switch(annimal){
            case  0:printf(" 狗");
                   break;
            case  1:printf(" 猪");
                   break;
            case  2:printf(" 鼠");
                   break;
            case  3:printf(" 牛");
                   break;
            case  4:printf(" 虎");
                   break;
            case  5:printf(" 兔");
                   break;
            case  6:printf(" 龙");
                   break;
            case  7:printf(" 蛇");
                   break;
            case  8:printf(" 马");
                   break;
            case  9:printf(" 羊");
                   break;
            case 10:printf(" 猴");
                   break;
            case 11:printf(" 鸡");
                   break;
       }
       printf("\n");
}

int main(int argc,char *argv[])
{
    struct timespec tp;
    struct tm *my_tm = NULL;

    clock_gettime(CLOCK_REALTIME,&tp);

//    printf("tv_sec = %ld\n",tp.tv_sec);
//    printf("tv_nsec = %ld\n",tp.tv_nsec);

    my_tm = gmtime(&(tp.tv_sec));

    printf("%d-%d-%d ",my_tm->tm_year + 1900,my_tm->tm_mon + 1,my_tm->tm_mday + 1);
    printf("%d-%d-%d.%d(%d) ",my_tm->tm_hour + 8,my_tm->tm_min,my_tm->tm_sec,tp.tv_nsec/1000,tp.tv_nsec);

    //调用周函数
    print_week(my_tm->tm_wday);
    //调用生肖年函数
    print_annimal_year(my_tm->tm_year + 1900);

    return 0;
}
运行结果



2.对于大小端的问题,这个很好测试,共用体里面一个int 和 char数组,然后分别打印出他们的值运行结果,低位存储的是低位因此是小端


3.在redhat 7.0下gcc编译器中C++中的引用是占用8个字节的


4.处理大数的思路

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


#define MAXLEN  500


int  flag = 0;     //标志数组应该从哪里开始计算
int  a[MAXLEN];  
int  b[MAXLEN];
int  c[2*MAXLEN];  //将每一位的计算结果都保存在里面

// 翻转过来好处理
void reverse_str(char *str,int *array,int len)
{
      int i = 0;

      for(i = 0; i < len; i++){
            array[len - i - 1] = str[i] - '0'; //刚开始忘记'0'
      }//end for

}

void multiply(int *a,int *b,int *c,int sa_len,int sb_len)
{ 
    int  i = 0;
    int  j = 0;
    int  sum_len = sa_len + sb_len - 1;

    for(i = 0; i < sa_len; i++){
        for(j = 0; j < sb_len; j++){
            c[i + j] += a[i] * b[j];
            printf("c[%d]= %d ",i+j,c[i+j]);
        }//end for 2
        printf("\n");
    }//end for 1
     
    for(i = 0; i < sum_len - 1; i++){
        c[i+1] += c[i] / 10;
        c[i]   %= 10;
    }//end for
    
    if(c[i] != 0){
        flag = i;
    }else{
        flag = i - 1;
    }//end if else
}

void print_c_array(int *c,int sa_len,int sb_len)
{
    int i = 0;
    int sum_len = sa_len + sb_len;

    for(i = flag; i >= 0; i--){
        printf("%d",c[i]);
    }//end for
    printf("\n");
}

int main(int argc,char *argv[])
{
    char  sa[MAXLEN];
    char  sb[MAXLEN];
    int sa_len = 0;
    int sb_len = 0;

    memset(sa,0x00,sizeof(sa));
    memset(sb,0x00,sizeof(sb));

    gets(sa);
    gets(sb);

    sa_len = strlen(sa);
    sb_len = strlen(sb);

    printf("%s %d\n",sa,sa_len);
    printf("%s %d\n",sb,sb_len);

    reverse_str(sa,a,sa_len);
    reverse_str(sb,b,sb_len);

    multiply(a,b,c,sa_len,sb_len);

    print_c_array(c,sa_len,sb_len);

    return 0;
}


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


#define MAXLEN  100


int  flag;     //标志数组应该从哪里开始计算
int  a[MAXLEN];  
int  b[MAXLEN];
int  c[MAXLEN+1];  //将每一位的计算结果都保存在里面

// 翻转过来好处理
void reverse_str(char *str,int *array,int len)
{
      int i = 0;
      int j = MAXLEN - 1;

      // 1 2 3 4 5 6
      //       4 5 6
      for(i = len - 1; i >= 0; i--){
            array[j--] = str[i] - '0';
      }//end for

}

void large_number_add(int *a,int *b,int *c,int sa_len,int sb_len)
{ 
    int  i = 0;
    int  j = MAXLEN - 1;
    int  m = sa_len>sb_len?sa_len:sb_len;

    for(i = 0; i < m; i++,j--){
          c[j] += a[j] + b[j];
          if(c[j] >= 10){
			  c[j-1]  += c[j] / 10;
              c[j] = c[j] % 10;         
          }
		  printf("c[%d]=%d,c[%d]=%d\n",j,c[j],j-1,c[j-1]);
    }
    if(c[j] != 0){
        flag = j;
    }else{
        flag = j + 1;
    }

}

void print_c_array(int *c,int sa_len,int sb_len)
{
    int i = 0;
    int sum_len = sa_len + sb_len;

    for(i = flag; i < MAXLEN; i++){
        printf("%d",c[i]);
    }//end for
    printf("\n");
}

int main(int argc,char *argv[])
{
    char  sa[MAXLEN];
    char  sb[MAXLEN];
    int sa_len = 0;
    int sb_len = 0;

    memset(sa,0x00,sizeof(sa));
    memset(sb,0x00,sizeof(sb));

    gets(sa);
    gets(sb);

    sa_len = strlen(sa);
    sb_len = strlen(sb);

    printf("%s %d\n",sa,sa_len);
    printf("%s %d\n",sb,sb_len);

    reverse_str(sa,a,sa_len);
    reverse_str(sb,b,sb_len);

    large_number_add(a,b,c,sa_len,sb_len);

    print_c_array(c,sa_len,sb_len);

    return 0;
}



5.对于的define和typedef

include <stdio.h>


#define  max(a,b)  ((a)>(b)?a:b)

//int max(int a,int b);
//double max(double a,double b);

int main(int argc,char *argv[])
{
	printf("max(5,6)=%d\n",max(5,6));
	printf("max(2.8,3.2) = %lf\n",max(2.8,3.2));

	return 0;
}

#include <stdio.h>


#define  print_zero_n(num) do { \
    printf("%d\n",num); \
	num--; \
}while(num)

int main(int argc,char *argv[])
{
	int num = 10;
    print_zero_n(num);

	return 0;
}



不会出现硬类型,typedef 也可以屏蔽类型 

6.对于windows下的VC编译器中的可重入读写函数

freopen("data.in","r",stdin)
freopen("data.out","w",stdout)

7.malloc是不可重入但是线程安全的函数,因为malloc函数在用户空间要自己管理各进程共享的内存链表,由于有共享资源访问,本身会造成线程不安全。malloc并不是用于大量内存分配操作(容易产生碎片,速度问题),并且在多线程下也不太适合(malloc是不可重入但是线程安全的函数)

8.tcmalloc尝试使用粒度较好和有效的自旋锁,redis用jemalloc来解决内存碎片问题,jemalloc因为Facebook火起来的,FreeBSD很有名的开发人员,现在用在火狐上,tcmalloc是google的


9.在C语言中的struct中不可以写函数,但是C++里面可以写函数

struct node{
        int x;
    int y;
    int max(){
        return x>y?x:y;
    }
}a[10];


10.if 和 for的嵌套问题,其实if 包含for效率更高,寄存器不用来回的切换,if 判断之后,一直执行for语句,肯定效率高。


11.函数指针的简单使用

#include <stdio.h>


void (*print)(void *,int);

void print_int(void *array,int n)
{
     int i = 0;
     for(i = 0; i < n; i++){
        printf("%d ",((int*)array)[i]);
     }
     printf("\n");
}

void print_double(void *array,int n)
{
    int i = 0;
    for(i = 0; i < n; i++){
        printf("%.2f ",((double*)array)[i]);
    }
    printf("\n");

}


void print_num(void *array,int n,void (*print)(void *,int))
{
    print(array,n);
}


int main(int argc,char *argv[])
{
    int    array_int[5] = {1,2,3,4,5};
    double array_double[5] ={1.2,2.5,3.6,4.7,5.8};

    print_num(array_int,5,print_int);
    print_num(array_double,5,print_double);
    return 0; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值