在VS2010下正常编译所需的配置:http://wenku.baidu.com/view/ca6921609b6648d7c1c746b8.html
int main(int argc ,const char *argv[])
{
for(int i=0;i<argc;i++)//argc 控制台参数个数 ,argv[] 控制台输入的参数 ,一般什么都不加的情况下输出为路径
{
printf("%s \n",argv[i]);
}
printf("hello ");
return 0;//正常无错误时,走到此处返回0,出现错误时,不返回0
}
对于标准的输入输出中,首先参考 http://www.cplusplus.com/reference/cstdio/ 这个网站中有关
的部分
%d 为标准输出数字,f开头的,一般为输出文件,puts只可以输出字符串,不像printf可以输出其他的数字,字符等
#include<stdio.h>
int main(int argc ,const char *argv[])
{
for(int i=0;i<argc;i++)
{
printf("%s \n",argv[i]);
}
printf("hello ");
puts("Hello c");
char buf[100];
gets(buf);
puts(buf);
int a;
scanf("%d",&a);// 将所接受到的数字填充到a的变量所在的内存中
return 0;
}
普通宏定义
#define MAX_PI 3.14 在编译阶段就已经替换了,提高了运行时的速度
#define MAX(A,B) A>B?A:B
#define MIN(A,B)\
A>B?A:B
int i=0;
for(i=0;i<100;i++)//i++是在程序执行完毕才会执行i++,因此先输出99 ,后输出100
{
printf("i",%d);
}
printf("i",%d);
while 循环一般用于死循环,这种比较常用,如Socket编程中一直监听客户端的连接,当客户端连接时,建立Socket;同理,在游戏编程中,当服务器判断到达某一时刻开启某一类活动时,应该也会用到while循环
结构体
struct People{
int age;
char * name;
};
int main(int argc ,const char *argv[])
{
struct People p;
p.age =10;
p.name="xiaoli";
struct People p1= p;
printf(" %d ",p1.age);// p1 是新的内存空间,结构体赋值是直接复制 此时p1和p是没有什么关系的,如果再更改p,p1是不会变的,是内存的拷贝
}
结构体指针:多个变量操作同一块内存
struct People{
int age;
char * name;
};
int main(int argc ,const char *argv[])
{
struct People * p = new People;
p->age=10;
struct People * p1= p;//此时p1和p指向同一块空间,只要一个改变了,另一个也就改变了
p->age = 20;
printf(" %d is ",p1->age);
}
函数指针
void sayHello()
{
printf("sayHello");
}
int main(int argc ,const char *argv[])
{
void(*p)();//p可以指向的参数是返回值是没有的,传入参数也是没有的
p=sayHello;
p();//执行p
}
面向对象的C语言,用C语言实现单例
///Object Begin
#define ObjectField void(*onDelete)(void *);//析构函数
typedef struct Object{//为了体现继承关系
ObjectField
}Object;
#define ObjectCreate(TYPE) new TYPE //构造函数
#define ObjectDelete(obj){\
obj->onDelete(obj);\
delete obj;\
}
void ObjectOnDelete(void * obj)
{
printf("Object On Delete \n");
}
Object * ObjectInit(Object * obj)
{
obj->onDelete = ObjectOnDelete;
return obj;
}
Object end
typedef struct {//C语言的结构体中是没有成员方法的,可以用函数指针
ObjectField//继承来自Object Field
int age;
char * name;
void (*sayHello)();
}People;
//People *createPeople()
//{
//return new People;
//}
void PeoplesayHello()
{
printf("sayHello \n ");
}
People *deletePeople(People * p)
{
delete p;
}
People * PeopleInit(People * p ,int age, char *name)
{
ObjectInit((Object *)p);//先初始化父类,
p->age=age;
p->name= name;
p->sayHello=PeoplesayHello;
return p;
}
void PeopleOnDelete(Object *p)
{
ObjectOnDelete(p);
printf("People On Delete \n");
}
void sayHello()
{
printf("sayHello");
}
int main(int argc ,const char *argv[])
{
People *p = PeopleInit(ObjectCreate(People),20,"Xiaoli");
p->sayHello();
ObjectDelete(p);
}
C语言引入头文件
#include<stdio.h>
#include<stdlib.h>
#include"hello.h"//引入的头文件
字符串的操作 http://www.cplusplus.com/reference/cstring/
#include<string.h>
char buf[100];
memset(buf,0,100);
sprintf(buf,"Hello %d,%f,%s",100,10.1,"jike");
printf("%s \n",buf)
写文件
FILE *f = fopen("data.txt","w");
if(f!=NULL)
{
for(int i=0;i<100;i++)
{
fprintf(f,"Hello %d ",i);
}
}
fclose(f);
·····size_t fread( void * buffer , size_t size , size_t count , FILE * stream );
功 能:
从一个文件流中读数据,读取 count个元素 ,每个元素 size字节.如果调用成功返回 值大于count。如不成功,返回实际读取的元素个数,小于count.
从一个文件中读出来,写到一个缓冲区中
fseek(f,0,SEEK_END);//移动指向文件的位置到文件末尾
printf("%l longth",ftell(f));//ftell读取文件此刻的位置,由于在文件的末尾因此为文件的长度,ftell返回值是一个long类型的
int size = ftell(f);
char buf(ftell(f)+1);
fread(buf,sizeof(unsigned char),size,f);//从一个文件流中读数据,读取 count个元素 ,每个元素 size字节.如果调用成功返回 值大于count。如不成功,返回实际读取的元素个数,小于count
buf[size]='\0';
fclose(f);