NOTE:以下为我个人整理的,也在实际项目经常遇到的一些细节点,还不够全面,最近项目比较忙,有时间再好好整理下。
细节性点:
1. #include指令
1)#include<文件名>:搜寻系统文件头文件所在目录。E.g: #include</user/include>
2)#include”文件名”:搜寻当前目录,然后搜寻系统文件头文件目录。E.g:#include “C:\cprogs\utils.h”
2.Static:所声明的变量,只能在本文件内使用,用它声明的变量的初始化式必须是常量;
3.Struct:
1)不能使用 = or !=来判断两个结构是否相等或者不等;
2)两种命名结构的方法:
(1)“结构标记”;
E.g: struct part {........};
声明变量:struct part part1, part2;
(2)typedef来定义类型名;
E.g: typedef struct {.......} Part;
变量声明:Part part1, part2;
E.g: typedef struct Fly_Info{.....}FLYINFO, *P_FLYINFO;
变量声明:P_FLYINFO pFlyInfo;
4.-> 和 . 的区别: ->是指针对其指向对象以及成员的操作; . 是结构体对其成员的操 作,句点的优先级几乎高于所有其他运算符;
5.C语言不支持new和delete;
6.字符串字面量的操作:char ch; ch = “abc”[1], 结果是ch = ‘b’;
7. 对于十六进制数的打印信息设置为:%#x or %#X
8.v...printf(...)
1)vfprintf: int vfprintf(FILE *stream, char *format, va_list param);
e.g:
#include<stdio.h>
#include<stdarg.h>
FILE *fp;
int vfpf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vfprintf(fp, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
fp = tmpfile();
if (fp == NULL)
{
perror("tmpfile() call");
exit(1);
}
vfpf("%d %f %s", inumber, fnumber, string);
rewind(fp);
fscanf(fp,"%d %f %s", &inumber, &fnumber, string);
printf("%d %f %s\n", inumber, fnumber, string);
fclose(fp);
return 0;
}
2)vprintf: int vprintf(char *format, va_list param);
E.g:
#include <stdio.h>
#include <stdarg.h>
int vpf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vprintf(fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char *string = "abc";
vpf("%d %f %s\n",inumber,fnumber,string);
return 0;
}
3)vsprintf: int vsprintf(char *string, char *format, va_list param);
注: 该函数会出现内存溢出情况,建议使用vsnprintf
E.g:
#include <stdarg.h>
char buffer[80];
int vspf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vsprintf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
vspf("%d %f %s", inumber, fnumber, string);
printf("%s\n", buffer);
return 0;
}
7.字符串转换函数
1) double atof(const char *nptr);
E.g:
#include <stdlib.h>
#include <stdio.h>
int main()
{
Float f;
char *str ="12345.67";
f =atof(str);
printf("string = %s float = %f\n", str, f);
return 0;
}12345.670000
2)int atoi(const char *nptr);
3)long atol(const char *nptr);
4)double strtod(const char *nptr,char **endptr); strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('\0')才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。
E.g:
#include<stdlib.h>
#include<stdio.h>
void main()
{
char *endptr;
char a[] ="12345.6789";
char b[] ="1234.567qwer";
char c[] ="-232.23e4";
printf("a=%lf\n",strtod(a,NULL) );
printf("b=%lf\n",strtod(b,&endptr) );
printf("endptr=%s\n", endptr );
printf("c=%lf\n",strtod(c,NULL) );
}a=12345.678900
b=1234.567000
endptr=qwer
c=-2322300.000000
8.伪随机序列生成函数
1)int rand(void);
2)void srand(unsigned int seed);
9.void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const *));
E.g:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct city_info{
char *city;
int miles;
};
int compare_citys(const void *key_ptr, const void *element_ptr);
main()
{
char city_name[81];
struct city_info *ptr;
const struct city_info mileage[ ] = {{"A", 2260},{"B",3340},{“C”,1110},{“D”},1233};
printf("Enter the city name:");
scanf("%80[^\n]",city_name);
ptr=bsearch(city_name,mileage,sizeof(mileage)/sizeof(mileage[0]),sizeof(mileage[0]),compare_citys);
if(ptr != NULL)
printf("%s is %d miles from NewYork \n",city_name, ptr->miles);
else
printf("%s No found!\n",city_name);
return 0;
}
int compare_citys(const void *key_ptr, const void *element_ptr)
{
return strcmp((char*)key_ptr,((struct city_info*)element_ptr)->city);
}