C语⾔常⽤函数总结
⽬录
⼀进程相关函数
1 exit、_exit和return
exit(0):正常运⾏程序并退出程序;exit(1):⾮正常运⾏导致退出程序;return:返回函数。
return是语⾔级别的,它表⽰了调⽤堆栈的返回;⽽exit是系统调⽤级别的,它表⽰了⼀个进程的结束。
在stdlib.h中exit函数是这样⼦定义的:void exit(int status)。这个系统调⽤是⽤来终⽌⼀个进程的,⽆论在程序中的什么位置,只要执⾏exit,进程就会从终⽌进程的运⾏。讲到exit这个系统调⽤,就要提及另外⼀个系统调⽤,_exit,_exit()函数位于unistd.h中,相⽐于exit(),_exit()函数的功能最为简单,直接终⽌进程的运⾏,释放其所使⽤的内存空间,并销毁在内存中的数据结构,⽽exit()在于在进程退出之前要检查⽂件的状态,将⽂件缓冲区中的内容写回⽂件。
⾮主函数中调⽤return和exit效果很明显,但是在main函数中调⽤return和exit的现象就很模糊,多数情况下现象都是⼀致的。
2 asrt()宏⽤法
asrt是宏,⽽不是函数。在C的asrt.h头⽂件中。原型定义:
#define asrt(expr)\
((expr)\
__ASSERT_VOID_CAST(0)\
:__asrt_fail(__STRING(expr),__FILE__,__LINE__,__ASSERT_FUNCTION))
/*DefinedInGlibc2.15*/
asrt的作⽤是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印⼀条出错信息,然后通过调⽤ abort来终⽌程序运⾏。windows平台上asrt宏只在relea模式下有效。Linux上则没有这个限制,⽆论Debug还是relea模式asrt都⽣效,但是如果你想让asrt失效,编译的时候加上-DNDEBUG即可。
#define NDEBUG
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<casrt>
using namespace std;
int main(int argc,char*argv[])
{
bool is = fal;
asrt(is);
printf("hell");
return0;
}
//输出:hell
这个宏通常原来判断程序中是否出现了明显⾮法的数据,如果出现了终⽌程序以免导致严重后果,同时也便于查找错误。
3 sockpair
4 access
access函数检查调⽤进程是否可以对指定的⽂件执⾏某种操作。原型:
int access(const char* pathname,int mode)
神舟战神笔记本怎么样
pathname:需要检测的⽂件路径名;mode:需要的操作模式,取值如下:
安然向暖F_OK 值为0,判断⽂件是否存在
X_OK 值为1,判断对⽂件是可执⾏权限
W_OK 值为2,判断对⽂件是否有写权限
R_OK 值为4,判断对⽂件是否有读权限
注:后三种可以使⽤或“|”的⽅式,⼀起使⽤,如W_OK|R_OK
成功执⾏时,返回0。失败返回-1,errno被设为以下的某个值
EINVAL: 模式值⽆效
EACCES: ⽂件或路径名中包含的⽬录不可访问
ELOOP : 解释路径名过程中存在太多的符号连接
ENAMETOOLONG:路径名太长
ENOENT:路径名中的⽬录不存在或是⽆效的符号连接
ENOTDIR: 路径名中当作⽬录的组件并⾮⽬录
EROFS: ⽂件系统只读
EFAULT: 路径名指向可访问的空间外
EIO:输⼊输出错误
ENOMEM: 不能获取⾜够的内核内存
ETXTBSY:对程序写⼊出错
5 sleep函数
在linux编程中,有时候会⽤到定时功能,常见的是⽤sleep(time)函数来睡眠time秒;但是这个函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执⾏该进程的时候,该进程会从sleep函数的下⼀条语句执⾏;这样的话就不会睡眠time秒了。
#include<unistd.h>
unsigned int sleep(unsigned int conds);//n秒
int usleep(uconds_t uc);//n微秒
sleep(time)返回值是睡眠剩下的时间。
以下情况不会中断。
do{
time =sleep(time);
}while(time >0);
⼆输出输⼊
1 C/C++输⼊输出函数
1. 缓冲区回车符
在C++中如果采⽤cin进⾏输⼊,则在缓存区留下回车字符,可以使⽤()或者是gets()读出。
2. cin类型不符
istream类重载了抽取运算符<< ,>>, 所以cin >> ⽀持c++内置的所有基本数据类型。cin对象将标准输⼊表⽰为字节流,然后根据抽取运算符<<(本质就是⼀个函数)的参数类型对字节流进⾏类型转换,转换为所需的类型。如果输⼊的前⾯⼀部分字符为空⽩(空格、换⾏符、和制表符),他们会跳过,直到遇到⾮空⽩字符。当输⼊没有满⾜程序期望的时候,⽐如对于⼀个int类型的变量a,却输⼊字符H,这种情况下,抽取运算发将不会改变变量a的值,并返回0,经常被放在循环条件中来终⽌循环。
3. ()
()每次读取⼀整⾏并把由Enter键⽣成的换⾏符留在输⼊缓冲区中。
4. line()
line()每次读取⼀整⾏,并把由Enter键⽣成的换⾏符抛弃,回车符并不留在缓冲区。
5. getline()
公告的格式
getline()每次读取到特定字符,并把特定字符抛弃,特定字符并不留在缓冲区。
getline()的原型是istream& getline ( istream &is , string &str , char delim );位于头⽂件<string>中。
其中 istream &is 表⽰⼀个输⼊流,譬如cin;string&str表⽰把从输⼊流读⼊的字符串存放在这个字符串中(可以⾃⼰随便命名,str 什么的都可以);char delim表⽰遇到这个字符停⽌读⼊,在不设置的情况下系统默认该字符为’\n’,也就是回车换⾏符(遇到回车停⽌读⼊,且回车符会被丢弃)。
cout << "plea cin a line:";
getline(cin, line, '#');
cout << "The line you give is:" << line <<endl;
short si =-1;
sprintf(s,"%04X", si);
产⽣“FFFFFFFF”,怎么回事?因为spritnf 是个变参函数,除了前⾯两个参数之外,后⾯的参数都不是类型安全的,函数更没有办法仅仅通过⼀个“%X”就能得知当初函数调⽤前参数压栈时被压进来的到底是个4 字节的整数还是个2 字节的短整数,所以采取了统⼀4字节的处理⽅式,导致参数压栈时做了符号扩展,扩展成了32 位的整数-1,打印时4 个位置不够了,就把32 位整数-1 的8 位16 进制都打印出来了。如果你想看si 的本来⾯⽬,那么就应该让编译器做0 扩展⽽不是符号扩展(扩展时⼆进制左边补0 ⽽不是补符号位):
sprintf(s, “%04X”, (unsigned short)si);就可以了。
2 变量地址和指针
1. 普通变量
int a;
cout <<&a;
2. 数组变量
int a[20];
cout <<&a;
cout <<(int*)a;
cout<<(void*)a;
3. 指针
int b =10;
int*a =&b;
cout <<(int*)a;
cout<<(void*)a;
3 cout进制输出
cout<<hex<<i<<endl;//输出⼗六进制数
cout<<oct<<i<<endl;//输出⼋进制数
cout<<dec<<i<<endl;//输出⼗进制数
cout <<tba(16)<< t << endl;
4 有关缓冲区的注意点
{
printf("hello world!!");//此时可以打出hello world!!
法国药妆
exit(0);//exit(0);⾸先会刷新缓冲区,然后调⽤_exit(0)结束程序
}
int main()
{
printf("hello world!!");//此时打不出来 hello world
_exit(0);//其作⽤就是结束函数
}
int main()
{
printf("hello world!!\n");//此时可以打出 hello world 因为“\n”也有刷新缓冲区的作⽤
_exit(0);
}
int main()
{
puts("hello world!!");//此时可以打出 hello world 因为 puts()函数⾃带有“\n”
_exit(0);
}
三参数解析函数
1 getopt_long
2 baname(分析路径成员 )
c语⾔:#include <libgen.h>
c++语⾔:#include <string.h>
原型:char *baname(char *path);
函数说明:
baname把以 null 结尾的路径名分解为⽬录和⽂件名。baname 则返回最后⼀个 ‘/’ 后⾯的内容。
如果路径名以 ‘/’ 结尾,该 ‘/’ 被认为不是 路径名的⼀部分。如果路径名 path 不包含斜杠 ‘/’, baname 返回 path 的副本。如果路径名 path 是“/”,baname均返回 “/”. 如果 路径名 path 是NULL指针或指向空串,则返回 “.”。baname 有可能更改 path 的内容, 因此如果需要保护原有路径名, 应该传送副本作为参数。此外, 返回的指针可能指向⼀块静态分配的内存, 会被下次调⽤覆盖。
3 getopt(分析命令⾏参数)
头⽂件:#include<unistd.h>
原型:int getopt(int argc,char * const argv[ ],const char * optstring);
儿童故事书 函数说明:参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下⼀个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串⾥的字母后接着冒号“:”,则表⽰还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
短参数的定义:etopt()使⽤optstring所指的字串作为短参数列表,象"1ac:d::"就是⼀个短参数列表。短参数的定义是⼀个’-‘后⾯跟⼀个字母或数字,象-a, -b就是⼀个短参数。每个数字或字母定义⼀个参数。
其中短参数在getopt定义⾥分为三种:
1. 不带值的参数,它的定义即是参数本⾝。
2. 必须带值的参数,它的定义是在参数本⾝后⾯再加⼀个冒号。
3. 可选值的参数,它的定义是在参数本⾝后⾯加两个冒号 。
在这⾥拿上⾯的"1ac:d::"作为样例进⾏说明,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。
在实际调⽤中,’-1 -a -c cvalue -d’, ‘-1 -a -c cvalue -ddvalue’, ‘-1a -ddvalue -c cvalue’都是合法的。这⾥需要注意三点:
1. 不带值的参数可以连写,象1和a是不带值的参数,它们可以-1 -a分开写,也可以-1a或-a1连写。
2. 参数不分先后顺序,’-1a -c cvalue -ddvalue’和’-d -c cvalue -a1’的解析结果是⼀样的。
3. 要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析错误。 返回值:
getopt()每次调⽤会逐次返回命令⾏传⼊的参数。
当没有参数的最后的⼀次调⽤时,getopt()将返回-1。
当解析到⼀个不在optstring⾥⾯的参数,或者⼀个必选值参数不带值时,返回’?’。
当optstring是以’:‘开头时,缺值参数的情况下会返回’:’,⽽不是’?’ 。
范例:
#include<stdio.h>
#include<unistd.h>介绍我的家乡
高考分数段
int main(int argc,int*argv[])
{
int ch;
opterr =0;
while((ch =getopt(argc,argv,"a:bcde"))!=-1)
{
switch(ch)
{
ca'a':
printf("option a:'%s'\n",optarg);小组意见
break;
ca'b':
printf("option b :b\n");
break;
default:
printf("other option :%c\n",ch);
}
}
printf("optopt +%c\n",optopt);
}
四字符操作函数及其实现
1 Strcat函数