//求一个字符串中的重复最长的子字符串
#include <stdio.h>
#include <string.h>
int findchar(char **s)
{
int i1=0,i2=0;//i1是寻找时的起始坐标,i2是寻找时的一样字符的起始坐标。
int max=1;//最长的重复的子串的长度
char *mp1=NULL;
char *ps=*s;
int len=strlen(ps); //数组长度
char *mp2=NULL;//mp1 mp2分别是找到的最大子串的第一个和第二个的地址
int m=0,n=0;
int cnt=0;
for (i1=0;i1<len-1;i1++)
{
for (i2=i1+2;i2<len;i2++)
{
m=i1;n=i2;cnt=0;
while ( *(ps+m) == *(ps+n) )
{
m++;n++;cnt++;
}
if(cnt>max)
{
max=cnt;mp1=ps+i1;mp2=ps+i2;
}
}
}
if(max!=1) *s=mp1;
return max;
}
int main()
{
char *s="etyuriabcdfboop";
int i=findchar(&s);//i is lenght of the largest string
int j=0;
printf("length=%d\n",i);
if(i!=1)
{
for (j=0;j<i;j++)
printf("%c",*(s+j));
printf("\n");
}
else printf("字符串中没有相同重复的子串\n");
return 0;
}
//define 命令
#include <stdio.h>
#define pt(x) printf(#x"=%d\n",x);//#的作用是将#后面的作为字符串(也替换)处理
#define MAX(TYPE) TYPE max_ ## TYPE(TYPE x,TYPE y) {return x>y?x?y; }
#define ARM11
int main()
//argv[0]为执行的命令,后面依次为命令行中输入的字符串,argc为argv中的数据的个数。
{
int x=10;
int y=20;
pt(x)
pt(y)
#ifdef ARM9 //定义了哪个值,就会打印相应的值。
printf("ARM9\n");
#elif defined ARM11
printf("ARM11\n");
#elif defined INTEL
printf("INTEL\n");
#endif
return 0;
}
预编译指令(Unix下的,不知道在Windows下能不能用): #line 100 表示这个预编译下面的语句的行号指定为100.剩下程序的行号依次类推。在***.h中如果有: #if __INCLUDE_LEVEL__<10 #include <***.h> #endif 这段预编译代码是指如果自包含自己头文件嵌套数目>10,就停止编译。如果在xxx.c中有如下预编译代码: #pragma GCC dependency “yyy.h” 是指如果 yyy.h比此xxx.c还要新,程序出错。#pragma GCC poison return int hello//表示在程序中不能使用return int hello 等词,否则程序报错( _Pragma(“GCC xxx yyy”)表示不能用xxx yyy 两者同样功效 )。 #pragma pack(1) 表示结构体中对齐方式最小为 1. #warning 产生警告信息,但是程序仍能正常运行。 #error产生错误信息,程序不能正常执行。
#include <stdio.h>
#include <string.h>
struct DATE;
#define SWAP(x,y) {DATE t;t=(x);(x)=(y);(y)=t;}
#define N 10 //the number of DATE array
typedef struct DATE
{
int year;int month;int day;
}DATE;
int fun1( void *px1,void *px2 )//year descending
{return ((DATE*)px2)->year-((DATE*)px1)->year;}
int fun2( void *px1,void *px2 )//month ascending
{return ((DATE*)px1)->month-((DATE*)px2)->month;}
int fun3( void *px1,void *px2 )//month ascending
{return ((DATE*)px1)->day-((DATE*)px2)->day;}
int fun4( void *px1,void *px2 )//按日期先后顺序排序
{
if ( ((DATE*)px1)->year > ((DATE*)px2)->year )
return 1;
else if ( ((DATE*)px1)->year < ((DATE*)px2)->year )
return 0;
else //year equal
{
if ( ((DATE*)px1)->month > ((DATE*)px2)->month )
return 1;
else if ( ((DATE*)px1)->month < ((DATE*)px2)->month )
return 0;
else //month equal
if( ((DATE*)px1)->day > ((DATE*)px2)->day )
return 1;
else if( ((DATE*)px1)->day < ((DATE*)px2)->day )
return 0;
}
return 0;
}
void pt(DATE *pdate,int n)
{
int i=0;
for (i=0;i<n;i++)
{printf("%d-%d-%d\n",(pdate+i)->year,(pdate+i)->month,(pdate+i)->day);}
}
void sort(void *pa,int n,int (*pfun)(void *px1,void *px2) )//排序通用算法
{
int i=0,j=0;
DATE* a=(DATE*)pa;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
if( pfun( (a+j),(a+j+1) )>0 ) SWAP(*(a+j),*(a+j+1));
}
}
int main()
{
DATE date[N];memset(date,N,sizeof(DATE));
int year,month,day,n=0, i=0;
printf("please input the num:\n");
scanf("%d",&n);
scanf("%*[^\n]");
scanf("%*c");
while(n--)
{
printf("please input the data(year-month-day)\n");
scanf("%d-%d-%d",&year,&month,&day);
//date[i++].year
date[i].year=year;date[i].month=month;date[i].day=day;
i++;
}
printf(".......................\n");
sort(date,i,fun1);pt(date,i);
printf(".......................\n");
sort(date,i,fun2);pt(date,i);
printf(".......................\n");
sort(date,i,fun3);pt(date,i);
printf(".......................\n");
sort(date,i,fun4);
pt(date,i);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
char* sort(int cnt,...)//按升序排序
{
va_list vls;
va_start(vls,cnt);
char *maxs=va_arg(vls,char *);
char *t=NULL;
int i=0;
for (i=1;i<cnt;i++)
{
t=va_arg(vls,char *);
if ( strcmp(maxs,t)>0 )
maxs=t;
}
va_end(vls);
return maxs;
}
int main()
{
char s1[3][10];
char (*s)[10];
s=s1;
strcpy(*s,"bddk");
strcpy(*(s+1),"aabdkfk");
strcpy(*(s+2),"bcdefd");
printf("最大的字符串是:%s\n",sort(3,s,s+1,s+2) );
return 0;
}
5.时间函数
#include <time.h>
#include <stdio.h>
#include <string.h>
int main( )
{
char stime[100]={0};
time_t timesec;
time(×ec);//此句等同于timesec=time(NULL);
printf("从1970年至现在计算机经过的CPU秒数为:%ld\n",timesec);
struct tm *ltm=localtime(×ec);
printf("现在是 %d年-%d月-%d日\n",ltm->tm_year+1900,ltm->tm_mon+1,ltm->tm_mday);
printf("%d时-%d分-%d秒\n",ltm->tm_hour,ltm->tm_min,ltm->tm_sec);
printf("%s\n",asctime(ltm));//asctime将时间转化成默认的字符串格式。
int day=0;
printf("input the added days:\n");
scanf("%d",&day);
ltm->tm_mday+=day;//日期加day天
printf("%s\n",asctime(ltm));
int i;
for (i=0;i<10000000;i++);
clock_t ct=clock();//clock函数返回这个进程用的时间,除以CLOCKS_PER_SEC就是这个进程用的秒数。
int second=ct/CLOCKS_PER_SEC ;
printf("%d\n",ct);
printf("%d\n",second);
return 0;
}
6.实心空心菱形:
打印一个实心菱形:
#include <stdio.h>
#define ISABS(x) ( (x)>=0?(x):-(x) )
int main()
{
int size=2;
int i,j;
for(i=-size;i<=size;i++)
{
for(j=-size;j<=size;j++)
{
if( ISABS(i)+ISABS(j) <= size )
printf("*");
else
printf(" ");
}
printf("\n");
}
}
打印一个空心菱形:
#include <stdio.h>
#define ISABS(x) ( (x)>=0?(x):-(x) )
int main()
{
int size=2;
int i,j;
for(i=-size;i<=size;i++)
{
for(j=-size;j<=size;j++)
{
if( ISABS(i)+ISABS(j) == size )
printf("*");
else
printf(" ");
}
printf("\n");
}
}