欢迎访问个人博客http://www.jkraise.top
给main 函数传参
#include<stdio.h>
int main(int argc, char * argv[]){
printf("%d\n", argc);
for(int i=0; i<argc; i++){
printf("%s\n", argv[i]);
}
return 0;
};
条件编译指令
#include<stdio.h>
#define VERSION 5.0
#define M 1
int main(int argc, char const *argv[])
{
#if M==2
printf("------2------\n");
// 注意 这里 else if 是错的, elif
#elif M==1
printf("------1------\n");
#else
printf("1-----2-----3---\n");
#endif
printf("------2------\n");
printf("------3------\n");
return 0;
}
可以用于版本控制, 预编译
#ifdef, #ifndef条件翻译指令
indef
example
#include<stdio.h>
#define VERSION 5.0
#define M 1
int main(int argc, char const *argv[])
{
int num[]={1,234,634,243,34,565,545,};
for(int j=0; j<sizeof(num)/sizeof(num[0])-1; j++){
for (int i=0;i<sizeof(num)/sizeof(int)-1-j;i++){
if(num[i]>num[i+1]){
int temp;
temp = num[i];
num[i] = num[i+1];
num[i+1]=temp;
}
#ifdef TEST // 宏定义取消调试
printf("%d---\n", num[i]);
#endif
}
}
for (int k = 0; k < sizeof(num)/sizeof(int); k++)
{
printf("num[%d]----%d\n", k, num[k]);
}
return 0;
}
ifndef
example
#include <stdio.h>
#define VERSION 5.0
#define M 1
int main(int argc, char const *argv[])
{
int num[] = {
1,
234,
634,
243,
34,
565,
545,
};
for (int j = 0; j < sizeof(num) / sizeof(num[0]) - 1; j++)
{
for (int i = 0; i < sizeof(num) / sizeof(int) - 1 - j; i++)
{
if (num[i] > num[i + 1])
{
int temp;
temp = num[i];
num[i] = num[i + 1];
num[i + 1] = temp;
}
// 注意
#ifndef TEST // 宏定义取消调试 ifndef == ifnotdef
printf("%d---\n", num[i]);
#endif
}
}
for (int k = 0; k < sizeof(num) / sizeof(int); k++)
{
printf("num[%d]----%d\n", k, num[k]);
}
return 0;
}
注意: 最后必须有 endif
使用条件编译指令屏蔽调试bug
#define DEBUG1 1
#if DEBUG1 == 0 // format是格式控制, ##表示可以没有参数, __VA_ARGS__表示变量
#define Log(format,...) printf(format,## __VA_ARGS__)
#else
#define Log(format,..)
#endif
void test(){
Log("xxxxx");
}
int main(int argc, char const *argv[])
{
Log("%d\n",10)
return 0;
}
static和extern修饰局部变量
// 全局, 静态区
#include <stdio.h>
void test()
{
static int num = 100; //下次保留上次的值
num = num + 1; // num++; ++num; num+=1
printf("%d\n", num);
}
int main(int argc, char const *argv[])
{
test();
return 0;
}
extern
修饰的是全局变量
修饰局部变量, 报错
全局变量, 没有初始化, 那即是0
局部变量,美欧初始化, 那即是随机数
static 局部变量, 也是0
注意:
静态变量 的生命周期是整个程序
但是作用域还是那个函数内
ex:
注意
// 如果一个A文件中c定义了一个全局变量, 如果B文件中c需要使用此全局变量,name就绪在B.c文件中进行声明: 声明的方法为: 把定义拿过来,然后在最前面添加exxtern, 然后再删除赋值的部分
static
文件的概念与分类
c文件指针
格式为: FILE *变量名
指向结构体指针
以Turbo C 为例, FILE在stdio.h文件中的文件类型如下
#include <stdio.h>
int main()
{
FILE *fp=NULL;
fp = fopen("文件名", "w");
if(fp !=NULL){
// 可以正常执行
}
fclose(fp);
return 0;
}
#include <stdio.h>
struct person
{
char name[30];
char sex;
int age;
} xiaomi = {"小米", 'm', 30}, xiaoWen = {"小文", 'w', 30};
int main(int argc, char const *argv[])
{
FILE *fp = fopen("xiaomi.txt", "wb+");
if (fp != NULL)
{
fwrite(&xiaomi, sizeof(struct person), 1, fp);
fwrite(&xiaoWen, sizeof(struct person), 1, fp);
rewind(fp); // 作用是让文件指针会开头, 不是fp这个文件指针
struct person name[2];
fread(&name[0], sizeof(struct person), 1, fp);
printf("%s,%c,%d\n", name[0].name, name[0].sex, name[0].age);
fread(&name[1], sizeof(struct person), 1, fp);
printf("%s,%c,%d\n", name[1].name, name[1].sex, name[1].age);
}
fclose(fp);
return 0;
}
fscanf和fprintf
fscanf(fp, "%d", &num);
fprintf(fp, "%d", num);
FILE * fp = fopen("world.txt", "w");
if(fp !=NULL){
fprintf(fp, "%d:%d", 30,100);
}
fclose(fp);