linux下C语言基础

原创 2013年12月04日 21:26:47

1.基本结构-输出函数
linux下c语言产生的为.c文件,不可执行,需要翻译连接

vi xxx.c  编辑 产生xxx.c为c语言源文件
gcc xxx.c 编译连接 ,生成可执行文件 a.out  //可分开为编译gcc -c xxx.c 生成xxx.o 连接 gcc xxx.o
a.out     执行

c语言源程序.c可移植,.out已生成具体机器代码不可移植
-o制定可执行文件的命令 gcc hello.c -o m1 生成可执行文件m1 执行时m1
\续行符 一行后加\连接两行

%i/ %d : int
%hd / %ld : short int / long int
%u : unsigned int
%x / %o : 十六进制 / 八进制
%%f / %lf : float / double
%g : float / double 去掉尾随的0
%c : char
%s : string
%p : address


2.变量-常量
vi本身存在初始化文件 ~/.exrc 可vi打开编辑进行设置 例如 set nu    :set all查看所有可设置命令

查看汇编代码 gcc -S m1 生成汇编文件m1.s 也可直接编译m1.s  查看 vi m1.s
sizeof()中只分析类型不参与计算 eg sizeof()
esp / ebp 栈
const int PI=3.14 <==>int const PI=3.14   const只读变量,一旦确定不能修改
程序编译错误分析 : 程序中有游离的"\nnn" -->标点符号中有中文

#define NAME "黄坤"
#define DATE 20131124 ==>宏
查看预处理后的效果 显示在屏幕上 cc -E xxx.c

scanf("%s",&str) //读取到空格为止
gets() //专业读取一行字符串,危险函数禁止使用
scanf("%*[^\n]%*c"); scanf("%*c");抛弃 ^非 []为范围 //清空缓存。
{
   char c;
   do
      scanf("%c");
      while (c!='\n');
}
//接受的键盘信息中除回车外统统抛弃,不作响应

puts() 输出一行字符串

将字符串放进数组中 char a[100]; strcpy(a,"gggggggg");
字符串末尾追加字符串 strcat(a,"zhuijia");//必须确保空间足够  // <string.h>
strchr(a,'s') 字符串中查找字符 返回字符开始的部分,找不到返回空地址
strrchr(a,'s') 从右向左找
strstr(a,"xxx")字符串中查找字符串
strcmp()比较两个字符串是否相等 strlen()查看字符串长度
"hello"[0];即字符'h'

结构体初始化 person c={age:18,name:furong};
引用:c.name,c.age   数组只能初始化,不能赋值 strcpy(a.name,"xxx");
结构体中:unsigned char 或unsigned int (只有这两种变量允许)
允许指定每个成员占的位数 unsigned char userread:1; //指定成员userread占1位 理论上占1字节=4位
但是分配内存时分别补齐1字节和4字节的倍数
小端存储:cpu存储ox12345678时为78 56 34 12
大端存储:存储方式 12  34  56  78  不同的系统存储方式不同

一个人程序函多个文件时 编译连接 分开进行:分别编译gcc *.c形成n个.o文件-->gcc xx.o mm.o
一个文件中插入另一个文件#include"xxx.c";

静态局部变量第一次分配空间,直到程序结束。每次改变静态变量值,即永久保存  }若。。。。
动态局部变量执行完语句后即收回空间       }若未初始化,系统自动初始化为0

register寄存器 和volatile
寄存器变量 register int i;//请求编译器将i放在寄存器中,仅仅是请求
volatile int i;//表明i随时可能被其它未知的原因修改
寄存器无地址,因为地址存在于内存中 若用寄存器的同时用取地址则忽略寄存器


int a(void);//void明确表示不接受任何参数,空表示参数不确定
不定参数表:
int max(int cnt,...)
{
va_list v;       //#include<stdarg.h>//va_list为(地址)类型,v保存可变长参数表
va_start(v,cnt);//v保存参数cnt之后的参数表,va_start(开始一个参数表)
int i;
int maxvalue=va_arg(v,int);//从参数表中取出一个int型参数
for(i=0;i<cnt;i++)
{
int data=va_arg(v,int); //一次取参数表中的每个参数
if(data>maxvalue)
maxvalue=data;
}
va_end(v); //释放可变长参数表
return maxvalue;//返回值最大值
}

检查是否定义过宏:#ifdef I  //如果没定义过
   #define I "sss" //将I定义为"sss"
    #else
          #undef I //取消对I的定义

防止头文件重复插入 框架
#ifndef VX     //(VX通常为文件名 XXX_H)
#define VX 1
头文件内容
#endif

C语言中预先定义好的宏,可直接使用
__FILE__文件名  __LINE__ 行号 __DATE__ 当前日期 __TIME__当前时间 __STDC__C语言  (双下划线)

带参数的宏,后面的参数加()
宏替换天然缺陷:不能将带++ -- 和赋值的式子作为参数
宏中#的作用:将参数变成对应的字符串//#define STR(x) puts(#x) -->STR(he)-->输出he
##作用:拼接

//野指针-->未初始化的指针-->避免方法:每次定义指针变量时int *q=0;
指针变量中0表示空指针NULL,字符变量中表示'\0',整型变量中表示数值0
//悬空指针-->指向一个可能已经释放的地方的指针-->//不要返回普通局部变量的地址
const char* q=NULL //声明不能通过指针p修改p所指向的数据,否则编译报错,但不限制通过其他渠道修改
const char * q==char * const q 为常量,必须初始化

命令行参数的使用:(由main()函数参数决定,由shell执行)
int main(int argc,char*argv[])   //argc为参数个数,argv[]每个元素中放每个字符串地址
//命令行是字符串,即使数字也是"12"、"34"字符串

void*addr //void类型指针,在使用时先强制类型转换,如*(unsigned char*)addr++
int* p[5]; //p是一个数组,5个元素,每个元素是 int *
int* p(double); //p是一个函数,形参double,返回类型int*
int (*p)[5]; //p是指针,指向5个元素的int型数组-->指向数组的指针
int(*p)(double);//p是指向(参数为double型,返回值为int型)的函数的指针

对函数名取地址,&可有可无-->函数名本身是个地址

fflush(stdout);//标准刷新
sscanf()  //从字符串中读取数据
sprintf(); //输出到字符数组中
(*p).成员==p->成员

查询某一函数所需的头文件,man 函数名

stdin//标准输入 stdout//标准输出 stderr//标准错误输出,不缓冲,不能重定向
即可以将键盘当做一个输入文件,将屏幕当做一个输出文件(操作系统将屏幕键盘分别当做一个文件)
fscanf(FILE*,);
fprintf(文件,);
fopen();打开文件 //FILE* fi=fopen("in","r");//in文件名 r打开方式
   //fscanf(fi,"%s",name);
   //fclose(fi);

puts();输出一行并换行   char buf[100];gets[buf];
gets();丢弃换行符,换成'\0'
fgets();从文件读取一行,保留换行符作为字符串的一部分
fputf();向文件写时不自动加换行符

scanf("%[^\n]%*c",buf);//读取一行,直到换行为止,并丢弃换行符
tee file 回车+内容==》将内容打印在屏幕上并输入在file文件里

定位读写:交换一个文件中第一行的第10,20两个数,假设共27字母
#include<stdio.h>
int main()
{
 FILE* fp=fopen("file","r++"); //打开文件file
 if(fp==NULL)
 {printf("无法打开file\n");
 return 1;}        //判断是否成功打开
 fseek(fp,9,SEEK_SET);       //fp文件从行首偏移9个字节
 char c10,c20;
 c10=getc(fp);                 //读取一个字符,放在c10中
 fseek(fp,9,SEEK_CUR);       //从当前位置偏移9字符,到第20个
 c20=getc(fp);   //此时停留在21位置
 fseek(fp,-11,SEEK_CUR); //回退
 putc(c20,fp);
 fseek(fp,-8,SEEK_END);  //从尾部后退8个,因为末尾有换行。END最后一字符后面
 putc(c10,fp); 
 fclose(fp);
 return 0;
}

读写一块数据:fread/fwrite  不分数据类型
读:从文件向内存 
fread(内存地址,每条记录字节数,记录条数,文件名);
fwrite();//同上

#include<stdio.h>

{
typedef struct person{
 char name[20];
 char gender;
 int age;
 double salary;//姓名,性别,年龄,工资;
} person;  //定义结构体变量,名person

#int main()
{
 person a[5]={{"ss".'F',18,4000},{},{},{},{}}; //结构体变量数组,含5个数组元素,初始化
 //将此数组数据存入文件
 FILE* fp=fopen("person.dat","wb");//wb:保持文件内容原样
 //判断是否打开成功
 int b[10]={11,22,33,44,55,66,77,88,99,1010};
 short s=12345;
 fwrite(a,sizeof(person),5,fp);
 fwrite(b,sizeof(int),10,fp);
 fwrite(&s,sizeof(short),1,fp);
 fclose(fp);
 return 0;


}   //end

//从文件中读取数据到变量(内存)--接上
 FILE* fp=fopen("person.dat","rb");
 fread(a,sizeof(person),5,fp);
 fread(b,sizeof(int),10,fp);
 fread(&s,sizeof(short),1,fp);
 fclose(fp);
ungetc();  向文件中退回一字节(退回到:下次读马上读位置)
不能将内存地址存入文件,程序结束内存收回

 

 

 

 

 

 

 

 

 

 

 

 

C语言面试基础题以及答案

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。 2. 用预处理指令写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 3.你怎么样用C编写死循环...
  • hanbingfengying
  • hanbingfengying
  • 2014年05月22日 14:22
  • 1954

C++语言基础知识点梳理

C++基础知识体系
  • xufeng0991
  • xufeng0991
  • 2013年12月23日 21:09
  • 2056

[零基础学软件开发1]创建第一个c语言程序

声明:我写这一系列文章在讲述过程中可能用了一些大白话,也可能有的地方墨迹了一些,但旨在把一些没有基础但很想学软件开发的一些人领进门来,另外该文章我同时也在百度经验发表。     我们编写软件的目的就...
  • u013250202
  • u013250202
  • 2013年12月24日 09:03
  • 1610

Linux下C语言编译基础及makefile的编写

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/13724/showart_80664.html 这篇文章介绍在LINUX下进行C语言编...
  • wangwenxc
  • wangwenxc
  • 2013年12月31日 15:30
  • 543

C语言开发必备基础只是------>Linux下C开发技能

工具善其事,必先利其器,关于Linux下C的一些常规名命令的使用,主要是针对gcc和gdb的一些相对比较简单的用法,以及常用的一些vim的命令Linux系统中默认是自带gcc编译器的,当然,默认的版本...
  • qq_29924041
  • qq_29924041
  • 2016年12月15日 22:01
  • 149

linux下的C语言快速学习—计算机体系结构基础简单了解

a、内存与地址 在我们学校每栋教学楼都有自己的编号,这里的教室编号就是地址,这个教室就是内存。 b、了解CPU CPU最核心的功能单元包括一下部分,寄存器(CPU内部的高速存储器,像内存一样可以...
  • WANGYAN9110
  • WANGYAN9110
  • 2014年07月21日 15:12
  • 747

Linux下C语言编译基础及makefile的编写

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识。在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助   1....
  • coloriy
  • coloriy
  • 2015年10月30日 13:15
  • 365

读书笔记-Linux C 编程从基础到实践-第二章 在Linux下进行C语言开发

读书笔记-Linux C 编程从基础到实践所有内容在 github/zxwtry/document/linux/201606/Linux C 编程从基础到实践 github链接:点击这里    ...
  • zxwtry
  • zxwtry
  • 2016年08月22日 15:05
  • 1019

一种简单的Linux下C语言串口驱动程序介绍

  • 2018年01月10日 22:08
  • 107KB
  • 下载

linux下基于哈夫曼树的具有压缩功能的代码(c语言)

  • 2017年12月29日 10:10
  • 18KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下C语言基础
举报原因:
原因补充:

(最多只允许输入30个字)