c语言 读取用户输入遇到c语言输出特殊符号号^时停止读取

c++编程时,如何停止字符的输入
当一个程序编译成功时,需要在dos下输入字符,统计元音的字符个数,但是如何去停止字符的输入呢?
09-08-13 &匿名提问
... C语言怎么样实现输入字符串的同时系统不停止. o, C语言中从键盘上输入五个字符串,按从小到大的顺序对... o, c语言如何让用户自行输入字符串,以此字符串作为文件. ... c语言编程培训,选华育,知名企业定向委培,金融风暴中打造高薪IT白领.
请登录后再发表评论!查看:7594|回复:7
如何用C语言实现在输入字符时不在屏幕显示
求大虾教导~~~
中级工程师
不回显字符复制内容到剪贴板代码:#include&iostream&
#include&conio.h&
using std::
using std::
int main(int argc, char **argv){
&&while(true){
& & char ch = getch();
& & if(ch == 13)&&//回车结束
&&return EXIT_SUCCESS;
}引用:原帖由 霜涯 于
20:12 发表
如何用C语言实现在输入字符时不在屏幕显示
求大虾教导~~~
The best of man is like water
Which benefits all things, and does not contend with them
Which flows in places that others disdain
Where it is in harmony with the Way
直接使用 getch();
要包含#include&conio.h&
斑竹~我想用纯C来实现哦~~
中级工程师
getch()函数就是纯C的库函数,你在C代码里使用就好,头文件&conio.h&引用:原帖由 霜涯 于
21:51 发表
斑竹~我想用纯C来实现哦~~
The best of man is like water
Which benefits all things, and does not contend with them
Which flows in places that others disdain
Where it is in harmony with the Way
现在明白了~~
#include &stdio.h&
#include &conio.h&
#include &string.h&
#define LEN 20
int Verification(const char*, char*);
int passwordinput(char*);
int main(void)
char name[LEN];
char password[8];
printf(&Please enter 6 user name!:&&&);
gets(name);
while(Verification(pt,pp) != 1);
puts(&welcome come to C world!\n&);
int passwordinput(char* pp) {
int count = 0;
printf(&Please enter 7 word password!:&&&);
while( (ch = getch()) != '\r') {
&&*(pp++) =
&&putchar('*');
&&count++;
putchar('\n');
int Verification(const char *pt, char *pp)
char namecode[8];
int cons = 355325;
while(passwordinput(pp) != 7) ;
while((ch = *(pt++)) != '\0') {
printf(&%d\n&,cons);
for(j = 0;j&7;j++) {
&&namecode[j] = cons && j+1;
&&namecode[j] = namecode[j] & 127;
&&if(namecode[j] & 'O') {
& &namecode[j] = namecode[j]%10 + '0';
&&} else if(namecode[j] & 'm') {
& &namecode[j] = (namecode[j]%24) + 'A';
&&} else {
& &namecode[j] = (namecode[j]%24) + 'a';
&&printf(&%c&&%d\n&, namecode[j],namecode[j]);
namecode[7] = '\0';
puts(namecode);
if(strcmp(namecode,pp) !=0) {
&&puts(&password error! Please re input password!&);
&&return 0;C语言函数手册-共享资料网
C语言函数手册
《 C 语言函数手册》1 字符操作函数1.1 C 语言 isxdigit()函数:判断字符是否为 16 进制数字 头文件:#include &ctype.h& 定义函数:int isxdigit (int c); 函数说明:检查参数 c 是否为 16 进制数字,只要 c 为下列其中一个情况就检测成功。 16 进制数字:ABCDEF。 返回值:若参数 c 为 16 进制数字,则返回非 0,否则返回 0。 附加说明:此为宏定义,非真正函数。 1.2 C 语言 isupper()函数:判断字符是否为大写英文字母 头文件:#include &ctype.h& 定义函数:int isupper(int c); 函数说明:检查参数 c 是否为大写英文字母。 返回值:若参数 c 为大写英文字母,则返回非 0,否则返回 0。 附加说明:此为宏定义,非真正函数。 1.3 C 语言 ispunct()函数:判断字符是否为标点符号或特殊字符 头文件:#inlude &ctype.h& 定义函数:int ispunct(int c); 参数:c 为需要检测的字符。 返回值若:c 为标点符号或特殊符号(非空格、非数字和非英文字母)返回非 0 值,否则 返回 0。 注意,此为宏定义,非真正函数。 1.4 C 语言 isspace()函数:判断字符是否为空白字符 头文件:#include &ctype.h& 定义函数:int isspace(int c); 函数说明:检查参数 c 是否为空格字符,也就是判断是否为空格(' ')、定位字符(' \t ')、CR(' \r ')、换行(' \n ')、垂直定位字符(' \v ')或翻页(' \f ')的情况。 返回值:若参数 c 为空白字符,则返回非 0,否则返回 0。 附加说明:此为宏定义,非真正函数。 1.5 C 语言 isprint()函数:判断字符是否为可打印字符 头文件:#include &ctype.h& 函数定义:int isprint(int c); 参数:c 为需要被检测的字符。 返回值:如果 c 为可打印字符,将返回非 0 值,否则返回 0。 可打印字符的 ASCII 码值大于 0x1f(除了 0x7f(DEL)) ,这些字符可以显示到屏幕上,让我们 看到;不能显示在屏幕上,我们看不到的,叫控制字符,ASCII 码值为 0x00 ~ 0x1f,再加上 0x7f(DEL)。检测控制字符请使用 isiscntrl() 函数。 注意:此函数为宏定义,非真正函数。 1.6 C 语言 islower()函数:判断字符是否为小写字母 头文件:#include &ctype.h& 其原型为:int islower(int c); 参数:c 为需要检测的字符。 返回值:若参数 c 为小写英文字母,则返回非 0 值,否则返回 0。 注意,此为宏定义,非真正函数。 1.7 C 语言 isgraph()函数:判断字符是否为除空格以外的可打印字符 头文件:#include &ctype.h& 其原型为:int isgraph (int c); 参数:c 为需要检测的字符。 返回值: 如果 c 所对应的 ASCII 码可打印, 且为非空格字符, 则返回非 0 值, 否则返回 0。 注意:isgraph() 为宏定义,非真正函数。 1.8 C 语言 isdigit()函数:判断字符是否为阿拉伯数字 头文件:#include &ctype.h& 定义函数:int isdigit(int c); 函数说明:检查参数 c 是否为阿拉伯数字 0 到 9。 返回值:若参数 c 为阿拉伯数字,则返回 true,否则返回 null(0)。 附加说明:此为宏定义,非真正函数。 1.9 C 语言 iscntrl()函数:判断字符是否为 ASCII 码的控制字符 头文件:#include &ctype.h& 其原型为:int iscntrl(int c); 参数:c 为需要判断的字符。 返回值:若参数 c 为 ASCII 控制码,则返回非 0 值,否则返回 0。 控制字符的 ASCII 码值 0x00 ~ 0x1F, 再加上 0x7f(DEL), 控制字符在屏幕上显示时不占位 (看 不见) ;显示时占位(能看见)的字符叫打印字符,可以用 isprint() 来检测。 注意,iscntrl() 为宏定义,非真正函数。 1.10 C 语言 isascii()函数:判断字符是否为 ASCII 码字符 头文件:#include &ctype.h& 定义函数:int isascii(int c); 函数说明:检查参数 c 是否为 ASCII 码字符,也就是判断 c 的范围是否在 0 到 127 之间。 返回值:若参数 c 为 ASCII 码字符,则返回 true,否则返回 NULL(0)。 附加说明:此为宏定义,非真正函数。 1.11 C 语言 isalpha()函数:判断字符是否为英文字母 头文件:#include &ctype.h& isalpha() 用来判断一个字符是否是英文字母,相当于 isupper(c)||islower(c) 其原型为:int isalpha(int c); 参数:c 为需要被检测的字符。 返回值:若参数 c 为英文字母(a ~ z A ~ Z ) ,则返回非 0 值,否则返回 0。 注意,isalpha() 为宏定义,非真正函数。 1.12 C 语言 isalnum()函数:判断字符是否为英文字母或数字 头文件:#include &ctype.h& isalnum() 用来判断一个字符是否为英文字母或数字,相当于 isalpha(c) || isdigit(c) 其原型为:int isalnum(int c); 参数:c 为需要检测的字符。 返回值:若参数 c 为字母或数字,若 c 为 0 ~ 9 a ~ z 注意,isalnum()为宏定义,非真正函数。 A ~ Z 则返回非 0,否则返回 0。2 字符串操作函数2.1 C 语言 strtok()函数:字符串分割 头文件:#include &string.h& 定义函数:char * strtok(char *s, const char *delim); 函数说明: strtok()用来将字符串分割成一个个片段。 参数 s 指向欲分割的字符串, 参数 delim 则为分割字符串,当 strtok()在参数 s 的字符串中发现到参数 delim 的分割字符时则会将该 字符改为\0 字符。在第一次调用时,strtok()必需给予参数 s 字符串,往后的调用则将参数 s 设置成 NULL。每次调用成功则返回下一个分割后的字符串指针。 返回值:返回下一个分割后的字符串指针,如果已无从分割则返回 NULL。 2.2 C 语言 strstr()函数:返回字符串中首次出现子串的地址 头文件:#include &string.h& strstr()函数用来检索子串在字符串中首次出现的位置 其原型为:char *strstr( char *str, char * substr ); 参数说明:str 为要检索的字符串,substr 为要检索的子串。 返回值:返回字符串 str 中第一次出现子串 substr 的地址;如果没有检索到子串,则返回 NULL。 2.3 C 语言 strspn()函数:计算字符串 str 中连续有几个字符都属于字符串 accept 头文件:#include &string.h& strspn() 函数用来计算字符串 str 中连续有几个字符都属于字符串 accept 其原型为:size_t strspn(const char *str, const char * accept); 函数说明:strspn() 从参数 str 字符串的开头计算连续的字符,而这些字符都完全是 accept 所指字符串中的字符。简单的说,若 strspn() 返回的数值为 n,则代表字符串 str 开头连续 有 n 个字符都是属于字符串 accept 内的字符。 返回值:返回字符串 str 开头连续包含字符串 accept 内的字符数目。所以,如果 str 所包 含的字符都属于 accept,那么返回 str 的长度;如果 str 的第一个字符不属于 accept,那 么返回 0。 注意:检索的字符是区分大小写的。 提示:提示:函数 strcspn() 的含义与 strspn() 相反,可以对比学习。 2.4 C 语言 strrchr()函数:查找某字符在字符串中最后一次出现的位置 头文件:#include &string.h& strrchr() 函数用于查找某字符在字符串中最后一次出现的位置 其原型为:char * strrchr(const char *str, int c); 参数:str 为要查找的字符串,c 为要查找的字符。 strrchr() 将会找出 str 字符串中最后一次出现的字符 c 的地址,然后将该地址返回。 注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以 str 的组后一个字符也可以 被定位。 返回值:如果找到就返回该字符最后一次出现的位置,否则返回 NULL。 返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置。 设字符 在字符串中首次出现的位置为 i,那么返回的地址可以理解为 str + i。 提示:如果希望查找某字符在字符串中第一次出现的位置,可以使用 strchr() 函数。 2.5 C 语言 strpbrk()函数:返回两个字符串中首个相同字符的位置 头文件:#include &include.h& strpbrk()函数检索两个字符串中首个相同字符的位置 其原型为:char *strpbrk( char *s1, char *s2); 参数说明:s1、s2 要检索的两个字符串。 strpbrk()从 s1 的第一个字符向后检索,直到'\0',如果当前字符存在于 s2 中,那么返回当前 字符的地址,并停止检索。 返回值:如果 s1、s2 含有相同的字符,那么返回指向 s1 中第一个相同字符的指针,否则返 回 NULL。 注意:strpbrk()不会对结束符'\0'进行检索。 2.6 C 语言 strncpy()函数:复制字符串的前 n 个字符 头文件:#include &string.h& strncpy()用来复制字符串的前 n 个字符 其原型为:char * strncpy(char *dest, const char *src, size_t n); 参数说明:dest 为目标字符串指针,src 为源字符串指针。 strncpy()会将字符串 src 前 n 个字符拷贝到字符串 dest。 不像 strcpy(),strncpy()不会向 dest 追加结束标记'\0',这就引发了很多不合常理的问题,将 在下面的示例中说明。 注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 n 个字符。 返回值:返回字符串 dest。 2.7 C 语言 strncat()函数:在字符串的结尾追加 n 个字符 头文件:#inclue &string.h& strncat()用于将 n 个字符追加到字符串的结尾 其原型为:char * strncat(char *dest, const char *src, size_t n); 参数说明:dest 为目标字符串,src 为源字符串,n 为要追加的字符的数目。 strncat()将会从字符串 src 的开头拷贝 n 个字符到 dest 字符串尾部,dest 要有足够的空间来 容纳要拷贝的字符串。 如果 n 大于字符串 src 的长度, 那么仅将 src 全部追加到 dest 的尾部。 strncat()会将 dest 字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0'。 返回值:返回字符串 dest。 2.8 C 语言 strncasecmp()函数:比较字符串的前 n 个字符 头文件:#include &string.h& 定义函数:int strncasecmp(const char *s1, const char *s2, size_t n); 函数说明: strncasecmp()用来比较参数 s1 和 s2 字符串前 n 个字符, 比较时会自动忽略大小 写的差异。 返回值:若参数 s1 和 s2 字符串相同则返回 0。s1 若大于 s2 则返回大于 0 的值,s1 若小 于 s2 则返回小于 0 的值。 2.9 C 语言 strlen()函数:返回字符串的长度 头文件:#include &string.h& strlen()函数用来计算字符串的长度 其原型为:unsigned int strlen (char *s); 参数说明:s 为指定的字符串。 strlen()用来计算指定的字符串 s 的长度,不包括结束字符&\0&。 返回值:返回字符串 s 的字符数。 注意:strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给 它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而 sizeof 返回 的是变量声明后所占的内存数,不是实际长度,此外 sizeof 不是函数,仅仅是一个操作符, strlen()是函数。 2.10 C 语言 strdup()函数:复制字符串 头文件:#include &string.h& 定义函数:char * strdup(const char *s); 函数说明:strdup()会先用 maolloc()配置与参数 s 字符串相同的空间大小,然后将参数 s 字 符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用 free()来释放。 返回值:返回一字符串指针,该指针指向复制后的新字符串地址。若返回 NULL 表示内存不 足。 2.11 C 语言 strchr()函数:查找某字符在字符串中首次出现的位置 头文件:#include &string.h& strchr() 用来查找某字符在字符串中首次出现的位置 其原型为:char * strchr (const char *str, int c); 参数:str 为要查找的字符串,c 为要查找的字符。 strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。 注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以 str 的组后一个字符也可以 被定位。 返回值:如果找到指定的字符则返回该字符所在地址,否则返回 NULL。 返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置。 设字符 在字符串中首次出现的位置为 i,那么返回的地址可以理解为 str + i。 2.12 C 语言 strcspn()函数:计算字符串 str 中连续有几个字符都不属于字符串 accept 头文件:#inclued&string.h& strcspn() 用来计算字符串 str 中连续有几个字符都不属于字符串 accept 其原型为:int strcspn(char *str, char *accept); 参数说明:str、accept 为要进行查找的两个字符串。 strcspn() 从字符串 str 的开头计算连续的字符,而这些字符都完全不在字符串 accept 中。 简单地说, 若 strcspn() 返回的数值为 n, 则代表字符串 str 开头连续有 n 个字符都不含字 符串 accept 中的字符。 返回值:返回字符串 str 开头连续不含字符串 accept 内的字符数目。 注意:如果 str 中的字符都没有在 accept 中出现,那么将返回 atr 的长度;检索的字符是 区分大小写的。 提示:函数 strspn() 的含义与 strcspn() 相反,可以对比学习。 2.13 C 语言 strcpy()函数:复制字符串 头文件:#include &string.h& 定义函数:char *strcpy(char *dest, const char *src); 函数说明:strcpy()会将参数 src 字符串拷贝至参数 dest 所指的地址。 返回值:返回参数 dest 的字符串起始地址。 附加说明:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的 错误情况,在编写程序时请特别留意,或者用 strncpy()来取代。 2.14 C 语言 strcoll()函数:根据环境变量 LC_COLLATE 来比较字符串 头文件:#include &string.h& strcoll() 函数根据环境变量 LC_COLLATE 来比较字符串 其原型为:int strcoll( const char * str1, const char * str2 ); 参数说明:str1、str2 是要进行比较的两个字符串。 函数说明:strcoll() 会依环境变量 LC_COLLATE 所指定的文字排列次序来比较 s1 和 s2 字 符串。 默认情况下,LC_COLLATE 为&POSIX& 或&C&,strcoll() 和 strcmp() 一样根据 ASCII 比较字符串 大小。 对于设置了 LC_COLLATE 语言环境的情况下, 则根据 LC_COLLATE 设置的语言排序方式进行 比较。例如,汉字会根据拼音进行比较。 返回值:若字符串 str1 和 str2 相同则返回 0。若 str1 大于 str2 则返回大于 0 的值,否 则返回小于 0 的值。 2.15 C 语言 strcmp()函数:比较字符串(区分大小写) 头文件:#include &string.h& strcmp() 用来比较字符串(区分大小写) 其原型为:int strcmp(const char *s1, const char *s2); 参数:s1, s2 为需要比较的两个字符串。 字符串大小的比较是以 ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将 s1 第一个字符值减去 s2 第一个字符值,若差值为 0 则再继续比较下个字符,若差值不为 0 则将差值返回。例如字符串&Ac& 和&ba& 比较则会返回字符&A&(65)和'b'(98)的差值(-33)。 返回值:若参数 s1 和 s2 字符串相同则返回 0。s1 若大于 s2 则返回大于 0 的值。s1 若小 于 s2 则返回小于 0 的值。 注意:strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符;如果考虑到本地 化的需求,请使用 strcoll() 函数。 2.16 C 语言 strcat()函数:连接字符串 头文件:#include &string.h& strcat() 函数用来连接字符串 其原型为:char *strcat(char *dest, const char *src); 参数:dest 为目的字符串指针,src 为源字符串指针。 strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。 注意: dest 与 src 所指的内存空间不能重叠, 且 dest 要有足够的空间来容纳要复制的字符 串。 返回值:返回 dest 字符串起始地址。 2.17 C 语言 strcasecmp()函数:判断字符串是否相等(忽略大小写) 头文件:#include &string.h& 定义函数:int strcasecmp (const char *s1, const char *s2); 函数说明:strcasecmp()用来比较参数 s1 和 s2 字符串,比较时会自动忽略大小写的差异。 返回值:若参数 s1 和 s2 字符串相同则返回 0。s1 长度大于 s2 长度则返回大于 0 的值, s1 长度若小于 s2 长度则返回小于 0 的值。 2.18 C 语言 rindex()函数:查找字符串并返回最后一次出现的位置 头文件:#include &string.h& 定义函数:char * rindex(const char *s, int c); 函数说明:rindex()用来找出参数 s 字符串中最后一个出现的参数 c 地址,然后将该字符出 现的地址返回。字符串结束字符(NULL)也视为字符串一部分。 返回值:如果找到指定的字符则返回该字符所在的地址,否则返回 0。 2.19 C 语言 index()函数:查找字符串并返回首次出现的位置 相关函数:rindex, srechr, strrchr 头文件:#include &string.h& 定义函数:char * index(const char *s, int c); 函数说明:index()用来找出参数 s 字符串中第一个出现的参数 c 地址,然后将该字符出现 的地址返回。字符串结束字符(NULL)也视为字符串一部分。 返回值:如果找到指定的字符则返回该字符所在地址,否则返回 0. 2.20 C 语言 toupper()函数:将小写字母转换为大写字母 头文件:#include &ctype.h& 定义函数:int toupper(int c); 函数说明:若参数 c 为小写字母则将该对应的大写字母返回。 返回值:返回转换后的大写字母,若不须转换则将参数 c 值返回。 2.21 C 语言 tolower()函数:将大写字母转换为小写字母 头文件:#include &stdlib.h& 定义函数:int tolower(int c); 函数说明:若参数 c 为大写字母则将该对应的小写字母返回。 返回值:返回转换后的小写字母,若不须转换则将参数 c 值返回。 2.22 C 语言 toascii()函数:将字符转换成对应的 ASCII 码 头文件:#include &ctype.h& 定义函数:int toascii(int c); 函数说明:toascii()会将参数 c 转换成 7 位的 unsigned char 值,第八位则会被清除,此字符 即会被转成 ASCII 码字符。 返回值:将转换成功的 ASCII 码字符值返回。 2.23 C 语言 strtoul()函数:将字符串转换成 unsigned long(无符号长整型数) 头文件:#include &stdlib.h& strtoul() 函数源自于 “string to unsigned long ” , 用来将字符串转换成无符号长整型数(unsigned long) 其原型为:unsigned long strtoul (const char* str, char** endptr, int base); 参数说明:str 为要转换的字符串,endstr 为第一个不能转换的字符的指针,base 为字符串 str 所采用的进制。 函数说明: strtoul() 会将参数 str 字符串根据参数 base 来转换成无符号的长整 型 数 (unsigned long)。参数 base 范围从 2 至 36,或 0。参数 base 代表 str 采用的进制方式, 如 base 值为 10 则采用 10 进制,若 base 值为 16 则采用 16 进制数等。 strtoul() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab 缩进等,可以通过 isspace() 函数来检测) ,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结 束时('\0')结束转换,并将结果返回。 两点注意: 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。 若 endptr 不为 NULL ,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL, 则表示该参数无效, 或不使用该参数。 本文最后的范例没有展示 endptr 参 数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。 返回值:返回转换后的无符号长整型数;如果不能转换或者 str 为空字符串,那么返回 0; 如果转换得到的值超出 unsigned long int 所能表示的范围,函数将返回 ULONG_MAX(在 limits.h 头文件中定义) ,并将 errno 的值设置为 ERANGE。 2.24 C 语言 strtol()函数:将字符串转换成 long(长整型数) 头文件:#include &stdlib.h& strtol() 函数用来将字符串转换为长整型数(long) 其原型为:long int strtol (const char* str, char** endptr, int base); 参数说明:str 为要转换的字符串,endstr 为第一个不能转换的字符的指针,base 为字符串 str 所采用的进制。 函数说明: strtol() 会将参数 str 字符串根据参数 base 来转换成长整型数(long)。 参数 base 范围从 2 至 36, 或 0。 参数 base 代表 str 采用的进制方式, 如 base 值为 10 则采用 10 进 制,若 base 值为 16 则采用 16 进制等。 strtol() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab 缩进等,可以通过 isspace() 函数来检测) ,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结 束时('\0')结束转换,并将结果返回。 两点注意: 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。 若 endptr 不为 NULL ,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。 返回值:返回转换后的长整型数;如果不能转换或者 str 为空字符串,那么返回 0(0L);如 果转换得到的值超出 long int 所能表示的范围,函数将返回 LONG_MAX 或 LONG_MIN(在 limits.h 头文件中定义) ,并将 errno 的值设置为 ERANGE。 2.25 C 语言 strtod()函数:将字符串转换为 double(双精度浮点数) 头文件:#include &stdlib.h& 函数 strtod() 用来将字符串转换成双精度浮点数(double) 其原型为:double strtod (const char* str, char** endptr); 参数说明:str 为要转换的字符串,endstr 为第一个不能转换的字符的指针。 函数说明:strtod() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab 缩进 等,可以通过 isspace() 函数来检测) ,直到遇上数字或正负符号才开始做转换,到出现非数 字或字符串结束时('\0')才结束转换,并将结果返回。参数 str 字符串可包含正负号、小数点 或 E(e)来表示指数部分。如 123. 456 或 123e-2。 若 endptr 不为 NULL ,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。 返回值:返回转换后的浮点型数;若不能转换或字符串为空,则返回 0.0。 2.26 C 语言 gcvt()函数:将浮点型数转换为字符串(四舍五入) 头文件:#include &stdlib.h& 定义函数:char *gcvt(double number, size_t ndigits, char *buf); 函数说明: gcvt()用来将参数 number 转换成 ASCII 码字符串, 参数 ndigits 表示显示的位数。 gcvt()与 ecvt()和 fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号。若 转换成功,转换后的字符串会放在参数 buf 指针所指的空间。 返回值:返回一字符串指针,此地址即为 buf 指针。 2.27 C 语言 atol()函数:将字符串转换成 long(长整型) 头文件:#include &stdlib.h& atol() 函数的名字源于“ascii to long ” ,用来将字符串转换成长整型数(long) 其原型为:long atol(const char * str); 函数说明:atol() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab 缩进等,可 以通过 isspace() 函数来检测) , 直到遇上数字或正负符号才开始做转换, 而再遇到非数字或 字符串结束时('\0')才结束转换,并将结果返回。 返回值: 返回转换后的长整型数(long); 如果 str 不能转换成 long 或者 str 为空字符串, 那 么将返回 0。 2.28 C 语言 atoi()函数:将字符串转换成 int(整数) 头文件:#include &stdlib.h& atoi() 函数用来将字符串转换成整数(int) 其原型为:int atoi (const char * str); 函数说明:atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab 缩进 等,可以通过 isspace() 函数来检测) ,直到遇上数字或正负符号才开始做转换,而再遇到非 数字或字符串结束时('\0')才结束转换,并将结果返回。 返回值: 返回转换后的整型数; 如果 str 不能转换成 int 或者 str 为空字符串, 那么将返回 0。 2.29 C 语言 atof()函数:将字符串转换为 double(双精度浮点数) 头文件:#include &stdlib.h& 函数 atof() 用于将字符串转换为双精度浮点数(double) 其原型为:double atof (const char* str); atof() 的名字来源于 ascii to floating point numbers 的缩写,它会扫描参数 str 字符串,跳过 前面的空白字符(例如空格,tab 缩进等,可以通过 isspace() 函数来检测) ,直到遇上数字 或正负符号才开始做转换, 而再遇到非数字或字符串结束时('\0')才结束转换, 并将结果返回。 参数 str 字符串可包含正负号、小数点或 E(e)来表示指数部分,如 123. 456 或 123e-2。 返回值:返回转换后的浮点数;如果字符串 str 不能被转换为 double,那么返回 0.0。 温馨提示:ANSI C 规范定义了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共 6 个可以 将字符串转换为数字的函数,大家可以对比学习。另外在 C99 / C++11 规范中又新增了 5 个 函数,分别是 atoll()、strtof()、strtold()、strtoll()、strtoull(),在此不做介绍,请大家自行学 习。3 内存管理函数3.1 C 语言 memset()函数:将内存的前 n 个字节设置为特定的值 头文件:#include &string.h& memset() 函数用来将指定内存的前 n 个字节设置为特定的值 其原型为:void * memset( void * ptr, int value, size_t num ); 参数说明: ptr 为要操作的内存的指针。 value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值, int 和 char 可以根据 ASCII 码相互转换。 num 为 ptr 的前 num 个字节,size_t 就是 unsigned int 。 函数说明: memset() 会将 ptr 所指的内存区域的前 num 个字节的值都设置为 value, 然后 返回指向 ptr 的指针。 memset() 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。 3.2 C 语言 memmove()函数:复制内存内容(可以处理重叠的内存块) 头文件:#include &string.h& memmove() 用来复制内存内容 其原型为:void * memmove(void *dest, const void *src, size_t num); memmove() 与 memcpy() 类似都是用来复制 src 所指的内存内容前 num 个字节到 dest 所指的地址上。 不同的是, memmove() 更为灵活, 当 src 和 dest 所指的内存区域重叠时, memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。 3.3 C 语言 memcpy()函数:复制内存内容(忽略\0) 头文件:#include &string.h& memcpy() 用来复制内存 其原型为:void * memcpy ( void * dest, const void * src, size_t num ); memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。 memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很 大的灵活性,可以面向任何数据类型进行复制。 需要注意的是: dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现 断错误。 dest 和 src 所指的内存空间不能重叠(如果发生了重叠,使用 memmove() 会更加安全) 。 与 strcpy() 不同的是, memcpy() 会完整的复制 num 个字节, 不会因为遇到 “\0” 而结束。 返回值:返回指向 dest 的指针。注意返回的指针类型是 void,使用时一般要进行强制类型 转换。 3.4 C 语言 memcmp()函数:比较内存前 n 个字节 头文件:#include &string.h& 定义函数:int memcmp (const void *s1, const void *s2, size_t n); 函数说明:memcmp()用来比较 s1 和 s2 所指的内存区间前 n 个字符。 字符串大小的比较是以 ASCII 码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先 将 s1 第一个字符值减去 s2 第一个字符的值,若差为 0 则再继续比较下个字符,若差值不 为 0 则将差值返回。 例如, 字符串&Ac& 和&ba& 比较则会返回字符'A'(65)和'b'(98)的差值(-33) 。 返回值:若参数 s1 和 s2 所指的内存内容都完全相同则返回 0 值。s1 若大于 s2 则返回大 于 0 的值。s1 若小于 s2 则返回小于 0 的值。 3.5 C 语言 memchr()函数:在内存中查找特定字符 头文件:#include &string.h& 定义函数:void * memchr(const void *s, char c, size_t n); 函数说明:memchr()从头开始搜寻 s 所指的内存内容前 n 个字节,直到发现第一个值为 c 的字节,则返回指向该字节的指针。 返回值:如果找到指定的字节则返回该字节的指针,否则返回 0。 3.6 C 语言 memccpy()函数:复制内存中的内容 头文件:#include &string.h& 定义函数:void * memccpy(void *dest, const void * src, int c, size_t n); 函数说明:memccpy()用来拷贝 src 所指的内存内容前 n 个字节到 dest 所指的地址上。与 memcpy()不同的是, memccpy()会在复制时检查参数 c 是否出现, 若是则返回 dest 中值为 c 的下一个字节地址。 返回值:返回指向 dest 中值为 c 的下一个字节指针。返回值为 0 表示在 src 所指内存前 n 个字节中没有值为 c 的字节。 3.7 C 语言 bzero()函数:将内存(字符串)前 n 个字节清零 头文件:#include &string.h& bzero() 会将内存块(字符串)的前 n 个字节清零 其原型为:void bzero(void *s, int n); 参数:s 为内存(字符串)指针,n 为需要清零的字节数。 bzero()会将参数 s 所指的内存区域前 n 个字节,全部设为零值。 实际上,bzero(void *s, int n) 等价于 memset((void*)s, 0,size_tn),用来将内存块的前 n 个字 节清零,但是 s 参数为指针,又很奇怪的位于 string.h 文件中,也可以用来清零字符串。 注意: bzero() 不是标准函数, 没有在 ANSI 中定义, 笔者在 VC6.0 和 MinGW5 下编译没通过; 据称 Linux 下的 GCC 支持,不过笔者没有亲测。鉴于此,还是使用 memset() 替代吧。 3.8 C 语言 bcopy()函数:复制内存(字符串) 头文件:#include &string.h& bcopy() 函数用来复制内存(字符串) 其原型为:void bcopy(const void *src, void *dest, int n); 参数:src 为源内存块(字符串)指针,dest 为目标内存块(字符串)指针,n 为要复制的 内存(字符串)的前 n 个字节长度。 bcopy()与 memcpy()一样都是用来拷贝 src 所指的内存内容前 n 个字节到 dest 所指的地址, 不过参数 src 与 dest 在传给函数时是相反的位置。 bcopy() 不检查内存(字符串)中的空字节 NULL。 实际上,bcopy() 和 memcpy() 功能相同,用来复制内存块的前 n 个字节,但是 s1, s2 两 个参数为指针,又很奇怪的位于 string.h 文件中,所以也可以用来复制字符串。 注意:bcopy() 不是标准函数,没有在 ANSI 中定义,笔者在 VC6.0 和 MinGW5 下编译没通 过;据称 Linux 下的 GCC 支持,不过笔者没有亲测。鉴于此,还是使用 memcpy() 替代吧。 3.9 C 语言 bcmp()函数:比较内存(字符串)的前 n 个字节是否相等 头文件:#include &string.h& bcmp() 比较内存(字符串)的前 n 个字节是否相等 其原型为:int bcmp(const void *s1, const void * s2, int n); 参数:s1, s2 为需要比较的两块内存(或两个字符串) ,n 为要比较的长度。 返回值:如果 s1, s2 的前 n 个字节相等或者 n 等于 0,则返回 0,否则返回非 0 值。 bcmp() 函数不检查 NULL。 实际上,bcmp() 和 memcmp() 功能相同,用来比较内存块的前 n 个字节是否相等,但是 s1, s2 两个参数为指针,又很奇怪的位于 string.h 文件中,也可以用来比较字符串。 注意: bcmp() 不是标准函数, 没有在 ANSI 中定义, 笔者在 VC6.0 和 MinGW5 下编译没通过; 据称 Linux 下的 GCC 支持,不过笔者没有亲测。鉴于此,还是使用 memcmp() 替代吧。 3.10 C 语言 munmap()函数:解除内存映射 头文件:#include &unistd.h& #include &sys/mman.h& 定义函数:int munmap(void *start, size_t length); 函数说明:munmap()用来取消参数 start 所指的映射内存起始地址,参数 length 则是欲取 消的内存大小。 当进程结束或利用 exec 相关函数来执行其他程序时, 映射内存会自动解除, 但关闭对应的文件描述词时不会解除映射。 返回值: 如果解除映射成功则返回 0, 否则返回-1。 错误原因存于 errno 中错误代码 EINVAL 参数 start 或 length 不合法。 3.11 C 语言 mmap()函数:建立内存映射 头文件:#include &unistd.h& #include &sys/mman.h& 定义函数:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize); 函数说明:mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该 文件内容的读写。 参数说明: start 指向欲对应的内存起始地址,通常设为 NULL,代表让系统自动选定地址,对应成功后 该地址会返回。 length 代表将文件中多大的部分对应到内存。 prot 代表映射区域的保护方式,有下列组合: PROT_EXEC 映射区域可被执行; PROT_READ 映射区域可被读取; PROT_WRITE 映射区域可被写入; PROT_NONE 映射区域不能存取。 flags 会影响映射区域的各种特性: MAP_FIXED 如果参数 start 所指的地址无法成功建立映射时,则放弃映射,不对地址做修 正。通常不鼓励用此旗标。 MAP_SHARED 享。 MAP_PRIVATE 对应射区域的写入数据会复制回文件内, 而且允许其他映射该文件的进程共 对应射区域的写入操作会产生一个映射文件的复制,即私人的&写入时复制&(copy on write)对此区域作的任何修改都不会写回原来的文件内容。 MAP_ANONYMOUS 建立匿名映射, 此时会忽略参数 fd, 不涉及文件, 而且映射区域无法和 其他进程共享。 MAP_DENYWRITE 只允许对应射区域的写入操作, 其他对文件直接写入的操作将会被拒绝。 MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。 在调用 mmap()时必须要指定 MAP_SHARED 或 MAP_PRIVATE。 fd open()返回的文件描述词,代表欲映射到内存的文件。 offset 文件映射的偏移量,通常设置为 0,代表从文件最前方开始对应,offset 必须是分 页大小的整数倍。 返回值:若映射成功则返回映射区的内存起始地址,否则返回 MAP_FAILED(-1),错误原因存 于 errno 中。 错误代码: EBADF 参数 fd 不是有效的文件描述词。 EACCES 存取权限有误。 如果是 MAP_PRIVATE 情况下文件必须可读, 使用 MAP_SHARED 则 要有 PROT_WRITE 以及该文件要能写入。 EINVAL 参数 start、length 或 offset 有一个不合法。 EAGAIN 文件被锁住,或是有太多内存被锁住。 ENOMEM 内存不足。3.12 C 语言 malloc()函数:动态分配内存空间 头文件:#include &stdlib.h& malloc() 函数用来动态地分配内存空间 其原型为:void* malloc (size_t size); 参数说明:size 为需要分配的内存空间的大小,以字节(Byte)计。 函数说明:malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在 函数执行完成后不会被初始化, 它们的值是未知的。 如果希望在分配内存的同时进行初始化, 请使用 calloc() 函数。 返回值:分配成功返回指向该内存的地址,失败则返回 NULL。 由于申请内存空间时可能有也可能没有, 所以需要自行判断是否申请成功, 再进行后续操作。 如果 size 的值为 0, 那么返回值会因标准库实现的不同而不同, 可能是 NULL, 也可能不是, 但返回的指针不应该再次被引用。 注意: 函数的返回值类型是 void *, void 并不是说没有返回值或者返回空指针, 而是返回的 指针类型未知。 所以在使用 malloc() 时通常需要进行强制类型转换, 将 void 指针转换成我 们希望的类型,例如:char *ptr = (char *)malloc(10); // 分配 10 个字节的内存空间,用来存 放字符。 3.13 C 语言 getpagesize()函数:取得内存分页大小 头文件:#include &unistd.h& 定义函数:size_t getpagesize(void); 函数说明:返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件 分页大小相同。 返回值:内存分页大小。 附加说明:在 Intel x86 上其返回值应为 4096bytes。 3.14 C 语言 free()函数:释放动态分配的内存空间 头文件:#include &stdlib.h& free() 函数用来释放动态分配的内存空间 其原型为:void free (void* ptr); free() 可以释放由 malloc()、calloc()、realloc() 分配的内存空间,以便其他程序再次使用。 参数说明:ptr 为将要释放的内存空间的地址。 free() 只能释放动态分配的内存空间,并不能释放任意的内存。 3.15 C 语言 calloc()函数:分配内存空间并初始化 头文件:#include &stdlib.h& calloc() 函数用来动态地分配内存空间并初始化为 0 其原型为:void* calloc (size_t num, size_t size); calloc() 在内存中动态地分配 num 个长度为 size 的连续空间, 并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是 0。 返回值:分配成功返回指向该内存的地址,失败则返回 NULL。 如果 size 的值为 0, 那么返回值会因标准库实现的不同而不同, 可能是 NULL, 也可能不是, 但返回的指针不应该再次被引用。 注意: 函数的返回值类型是 void *, void 并不是说没有返回值或者返回空指针, 而是返回的 指针类型未知。所以在使用 calloc() 时通常需要进行强制类型转换,将 void 指针转换成我 们希望的类型。4 日期与时间函数4.1 C 语言 time()函数:获取当前时间(以秒数表示) 头文件:#include &time.h& 定义函数:time_t time(time_t *t); 函数说明:此函数会返回从公元 1970 年 1 月 1 日的 UTC 时间从 0 时 0 分 0 秒算起到现 在所经过的秒数。如果 t 并非空指针的话,此函数也会将返回值存到 t 指针所指的内存。 返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于 errno 中。 4.2 C 语言 settimeofday()函数:设置当前时间戳 头文件:#include &sys/time.h& #include &unistd.h& 定义函数:int settimeofday(const struct timeval *tv, const struct timezone *tz); 函数说明:settimeofday()会把目前时间设成由 tv 所指的结构信息,当地时区信息则设成 tz 所指的结构。详细的说明请参考 gettimeofday()。 注意,在 Linux 下,只有 root 权限才能使用此函数修改时间。 返回值:成功则返回 0,失败返回-1,错误代码存于 errno。 错误代码: EPERM 并非由 root 权限调用 settimeofday(),权限不够。 EINVAL 时区或某个数据是不正确的,无法正确设置时间。4.3 C 语言 mktime()函数:将时间转换成经过的秒数 头文件:#include &time.h& 定义函数:time_t mktime(strcut tm * timeptr); 函数说明:mktime()用来将参数 timeptr 所指的 tm 结构数据转换成从公元 1970 年 1 月 1 日 0 时 0 分 0 秒算起至今的 UTC 时间所经过的秒数。 返回值:返回经过的秒数。 4.4 C 语言 localtime()函数:获取当前时间和日期并转换为本地时间 头文件:#include &time.h& 定义函数:struct tm *localtime(const time_t * timep); 函数说明: localtime()将参数 timep 所指的 time_t 结构中的信息转换成真实世界所使用的时 间日期表示方法,然后将结果由结构 tm 返回。结构 tm 的定义请参考 gmtime()。此函数返 回的时间日期已经转换成当地时区。 返回值:返回结构 tm 代表目前的当地时间。 4.5 C 语言 gmtime()函数:获取当前时间和日期 头文件:#include &time.h& 定义函数:struct tm *gmtime(const time_t *timep); 函数说明:gmtime()将参数 timep 所指的 time_t 结构中的信息转换成真实世界所使用的时 间日期表示方法,然后将结果由结构 tm 返回。 结构 tm 的定义为 struct tm{ int tm_ //代表目前秒数, 正常范围为 0-59, 但允许至 61 秒 int tm_ //代表目前分数, 范围 0-59 int tm_ //从午夜算起的时数, 范围为 0-23 int tm_ //目前月份的日数, 范围 01-31 int tm_ //代表目前月份, 从一月算起, 范围从 0-11 int tm_ //从 1900 年算起至今的年数 int tm_ //一星期的日数, 从星期一算起, 范围为 0-6 int tm_ //从今年 1 月 1 日算起至今的天数, 范围为 0-365 int tm_ }; //日光节约时间的旗标 此函数返回的时间日期未经时区转换,而是 UTC 时间。 返回值:返回结构 tm 代表目前 UTC 时间。 4.6 C 语言 gettimeofday()函数:获取当前时间 头文件:#include &sys/time.h& #include &unistd.h& 定义函数:int gettimeofday (struct timeval * tv, struct timezone * tz); 函数说明:gettimeofday()会把目前的时间有 tv 所指的结构返回,当地时区的信息则放到 tz 所指的结构中。 timeval 结构定义为: struct timeval{ long tv_ long tv_ //秒 //微秒}; timezone 结构定义为: struct timezone { int tz_ int tz_ }; 上述两个结构都定义在/usr/include/sys/time.h. tz_dsttime 所代表的状态如下 DST_NONE //不使用 DST_USA //美国 DST_AUST //澳洲 DST_WET //西欧 DST_MET //中欧 DST_EET //东欧 DST_CAN //加拿大 DST_GB //大不列颠 DST_RUM //罗马尼亚 DST_TUR //土耳其 DST_AUSTALT //澳洲(1986 年以后) 返回值:成功则返回 0,失败返回-1,错误代码存于 errno。 附加说明:EFAULT 指针 tv 和 tz 所指的内存空间超出存取权限。 4.7 C 语言 ctime()函数:将时间日期以字符串格式表示 头文件:#include &time.h& 定义函数:char *ctime(const time_t *timep); 函数说明:ctime()将参数 timep 所指的 time_t 结构中的信息转换成真实世界所使用的时间 日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串 格式为&Wed Jun 30 21 :49 :08 1993\n&。 注意:若再调用相关的时间日期函数,此字符串可能会被破坏。 返回值:返回一字符串表示目前当地的时间日期。 4.8 C 语言 asctime()函数:将时间日期以字符串格式表示 //和 Greenwich 时间差了多少分钟 //日光节约时间的状态 相关函数:time, ctime, gmtime, localtime 头文件:#include &time.h& 定义函数:char *asctime(const struct tm * timeptr); 函数说明:asctime()将参数 timeptr 所指的 tm 结构中的信息转换成真实世界所使用的时间 日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串 格式为:&Wed Jun 30 21:49:08 1993\n& 返回值:若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与 ctime 不同处在 于传入的参数是不同的结构。 附加说明:返回一字符串表示目前当地的时间日期.5 数学函数5.1 C 语言 tanh()函数:双曲线正切函数 头文件:#include &math.h& tanh() 用来求一个数的双曲正切值 其原型为:double tanh(double x); 参数:x 为双曲正切上的某点。 返回值:返回 x 的双曲正切值,取值范围为 -1 到 1。 双曲正切的定义为 sinh(x)/cosh(x),即双曲正切曲线示意图:注意,使用 GCC 编译时请加入-lm。 5.2 C 语言 tan()函数:正切函数 头文件:#include &math.h& tan() 函数用来求给定值的正切值 其原型为:double tan(double x); 参数:x 为给定的弧度值。 返回值:返回 x 的正切值。 注意,使用 GCC 编译时请加入-lm。 5.3 C 语言 sqrt()函数:求给定值的平方根 头文件:#include &math.h& sqrt() 用来求给定值的平方根 其原型为:double sqrt(double x); 参数:x 为要计算平方根的值。 如果 x & 0,将会导致 domain error 错误,并把全局变量 errno 的值为设置为 EDOM。 返回值:返回 x 平方根。 注意,使用 GCC 编译时请加入-lm。 5.4 C 语言 sinh()函数:双曲正玄函数 头文件:#include &math.h& sinh() 用来求双曲正弦值 其原型为:double sinh(double x); 参数:x 为即将被计算的值。 双曲正弦的定义为:(exp(x)-exp(-x))/2,即双曲线示意图如下:返回值:返回参数 x 的双曲正玄值。 如果返回值过大,将返回 HUGE_VAL、或 HUGE_VALF、或 HUGE_VALL,正负号与 x 相同, 并导致一个范围溢出错误,将全局变量 errno 设置为 ERANGE。 注意,使用 GCC 编译时请加入-lm。 5.5 C 语言 sin()函数:正弦函数 头文件:#include &math.h& sin() 函数用来求给定值的正弦值 其原型为:double sin(double x); 参数:给定的值(弧度) 。 返回值:返回-1 至 1 之间的计算结果。 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 使用 rtod( ) 函数可以将弧度值转换为角度值。 注意,使用 GCC 编译时请加入-lm。 5.6 C 语言 pow()函数:求 x 的 y 次方(次幂) 头文件:#include &math.h& pow() 函数用来求 x 的 y 次幂(次方) 其原型为:double pow(double x, double y); pow()用来计算以 x 为底的 y 次方值,然后将结果返回。设返回值为 ret,则 ret = xy。 可能导致错误的情况: 如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误。 如果底数 x 和指数 y 都是 0, 可能会导致 domain error 错误, 也可能没有; 这跟库的实现 有关。 如果底数 x 是 0,指数 y 是负数,可能会导致 domain error 或 pole error 错误,也可能 没有;这跟库的实现有关。 如果返回值 ret 太大或者太小,将会导致 range error 错误。 错误代码: 如果发生 domain error 错误,那么全局变量 errno 将被设置为 EDOM; 如果发生 pole error 或 range error 错误,那么全局变量 errno 将被设置为 ERANGE。 注意,使用 GCC 编译时请加入-lm。 5.7 C 语言 log10()函数:返回以 10 为底的对数值 头文件:#include &math.h& log10() 返回以 10 为底的对数值 其原型为:double log10(double x); log10()用来计算以 10 为底的 x 的对数值,然后将结果返回。设返回值为 ret,则 x = 10ret 返回值:返回参数 x 以 10 为底的对数值。 如果 x 为负数或 0,则会发生错误并设置 errno 值。 错误代码: EDOM:参数 x 为负数; ERANGE:参数 x 为零值,零的对数值无定义。 注意:使用 GCC 编译时请加入-lm。 5.8 C 语言 log()函数:返回以 e 为底的对数值 头文件:#include &math.h& log() 函数返回以 e 为底的对数值 其原型为:double log (double x); log()用来计算以 e 为底的 x 的对数值,然后将结果返回。设返回值为 ret,则 x = eret 如果 x 为负数或 0,则会发生错误并设置 errno 值。 错误代码: EDOM:参数 x 为负数; ERANGE:参数 x 为零值,零的对数值无定义。 注意:使用 GCC 编译时请加入-lm。 5.9 C 语言 ldexp()函数:返回 x 乘上 2 的 exp 次方的值 头文件:#include &math.h& ldexp()用来求一个数乘上 2 的 exp 次方的值 原型为:double ldexp(double x, int exp); 参数:x 为尾数,exp 为幂数。 设返回值为 ret,则 ret = x * 2exp 返回值:返回 ret。 注意,使用 GCC 编译时请加入-lm。 5.10 C 语言 frexp()函数:把一个浮点数分解为尾数和指数 头文件:#include &math.h& frexp()用来把一个数分解为尾数和指数 其原型为:double frexp(double x, int *exp); 参数:x 为待分解的浮点数,exp 为存储指数的指针。 设返回值为 ret,则 x = ret * 2exp,其中 exp 为整数,ret 的绝对值在 0.5(含) 到 1(不 含)之间。 如果 x = 0,则 ret = exp = 0 返回值:将尾数 ret 返回。 注意,使用 GCC 编译时请加入-lm。 5.11 C 语言 exp()函数:e 的次幂函数(以 e 为底的 x 次方值) 头文件:#include &math.h& exp()用来计算以 e 为底的 x 次方值,即 ex 值,然后将结果返回。 其原型为:double exp(double x); 返回值:返回 e 的 x 次方计算结果。 注意,使用 GCC 编译时请加入-lm。 5.12 C 语言 cosh()函数:求双曲余玄值 头文件:#include &math.h& cosh()用来计算参数 x 的双曲余玄值,然后将结果返回。 其原型为:double cosh(double x); 双曲余弦的数学定义式为: (exp(x)+exp(x))/2,即 注意,使用 GCC 编译时请加入-lm。 5.13 C 语言 cos()函数:求余弦值 头文件:#include &math.h& cos() 函数用来求余弦值,即求角的临边长度除以斜边长度的比值 其原型为:double cos(double x); 参数:x 为一个弧度。 返回值:返回-1 至 1 之间的计算结果。 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 使用 rtod( ) 函数可以将弧度值转换为角度值。 注意,使用 GCC 编译时请加入-lm。 5.14 C 语言 ceil()函数:返回大于等于表达式的最小整数 头文件: #include &math.h& 函数名: ceil 用 法: double ceil(double x); 功 能: 返回大于或者等于指定表达式的最小整数 注意,使用 GCC 编译时请加入-lm。 5.15 C 语言 atan2()函数:求反正切的值(以弧度表示) 头文件:#include &math.h& 定义函数:double atan2(double y, double x); 函数说明:atan2()用来计算参数 y/x 的反正切值,然后将结果返回。 返回值:返回-PI/2 至 PI/2 之间的计算结果。 注意,使用 GCC 编译时请加入-lm。 5.16 C 语言 atan()函数:求反正切的值(以弧度表示) 头文件:#include &math.h& 定义函数:double atan(double x); 函数说明:atan()用来计算参数 x 的反正切值,然后将结果返回。 返回值:返回-PI/2 至 PI/2 之间的计算结果。 注意,使用 GCC 编译时请加入-lm。 5.17 C 语言 asin()函数:求反正弦的值(以弧度表示) 头文件:#include &math.h& 定义函数:double asin (double x) 函数说明:asin()用来计算参数 x 的反正弦值,然后将结果返回。参数 x 范围为-1 至 1 之 间,超过此范围则会失败。 返回值:返回-PI/2 之 PI/2 之间的计算结果。 错误代码:EDOM 参数 x 超出范围。 注意,使用 GCC 编译时请加入-lm。 5.18 C 语言 acos()函数:求反余弦的值 头文件:#include &math.h& acos() 函数返回一个以弧度表示的反余弦值 其原型为:double acos (double x); 参数:x 为余弦值,范围为 -1 到 1 之间,超出此范围将会导致错误,并设置 errno 的值 为 EDOM. 返回值:返回 0 至 π 之间的计算结果,单位为弧度,在函数库中角度均以弧度来表示。 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 注意:使用 GCC 编译时请加入-lm。 5.19 C 语言 abs()函数:求绝对值(整数) 头文件:#include &stdlib.h& 定义函数:int abs (int j); 函数说明:abs()用来计算参数 j 的绝对值,然后将结果返回。 返回值:返回参数 j 的绝对值结果。6 文件操作函数6.1 C 语言 ungetc()函数:把字符退回到输入流 头文件:#include&stdio.h& ungetc()函数用于将一个字符退回到输入流中,这个退回的字符会由下一个读取文件流的函 数取得。 其原型如下:int ungetc(char c, FILE *stream); 参数:c 为要退回的字符,stream 为要退回的输入流。 返回值:若该函数执行成功,返回非零值;否则,返回 0。 6.2 C 语言 endgrent()函数:关闭文件(关闭组文件) 相关函数:getgrent, setgrent 头文件:#include &grp.h& #include &sys/types.h& 定义函数:void endgrent(void); 函数说明:endgrent()用来关闭由 getgrent()所打开的密码文件。 6.3 C 语言 endpwent()函数:关闭文件(关闭密码文件) 相关函数:getpwent, setpwent 头文件:#include &pwd.h& #include &sys/types.h& 定义函数:void endpwent(void); 函数说明:endpwent()用来关闭由 getpwent()所打开的密码文件。 6.4 C 语言 endutent()函数:关闭文件(关闭 utmp 文件) 相关函数:getutent, setutent 头文件:#include &utmp.h& 定义函数:void endutent(void); 函数说明:endutent()用来关闭由 getutent 所打开的 utmp 文件。 6.5 C 语言 fgetgrent()函数:读取组格式函数 相关函数:fgetpwent 头文件:#include &grp.h& #include &stdio.h& #include &sys/types.h& 定义函数:struct group * getgrent(FILE * stream); 函数说明: fgetgrent()会从参数 stream 指定的文件读取一行数据, 然后以 group 结构将该数 据返回. 参数 stream 所指定的文件必须和、etc/group 相同的格式. group 结构定义请参考 getgrent(). 返回值:返回 group 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.6 C 语言 fgetpwent()函数:读取密码格式 相关函数:fgetgrent 头文件:#include &pwd.h& #include &stdio.h& #include &sys/types.h& 定义函数:struct passwd * fgetpwent(FILE * stream); 函数说明: fgetpwent()会从参数 stream 指定的文件读取一行数据, 然后以 passwd 结构将该 数据返回. 参数 stream 所指定的文件必须和/etc/passwd 相同的格式. passwd 结构定义请 参考 getpwent(). 返回值:返回 passwd 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.7 C 语言 getegid()函数:获得组识别码 相关函数:getgid, setgid, setregid 头文件:#include &unistd.h& #include &sys/types.h& 定义函数:gid_t getegid(void); 函数说明:getegid()用来取得执行目前进程有效组识别码. 有效的组识别码用来决定进程执 行时组的权限. 返回值:返回有效的组识别码. 6.8 C 语言 geteuid()函数:获取用户识别码函数 相关函数:getuid, setreuid, setuid 头文件:#include &unistd.h& #include &sys/types.h& 定义函数:uid_t geteuid(void); 函数说明:geteuid()用来取得执行目前进程有效的用户识别码. 有效的用户识别码用来决定 进程执行的权限, 借由此改变此值, 进程可以获得额外的权限. 倘若执行文件的 setID 位已 被设置, 该文件执行时, 其进程的 euid 值便会设成该文件所有者的 uid. 例如, 执行文件 /usr/bin/passwd 的权限为-r-s--x--x, 其 s 位即为 setID(SUID)位, 而当任何用户在执行 passwd 时其有效的用户识别码会被设成 passwd 所有者的 uid 值, 即 root 的 uid 值(0). 返回值:返回有效的用户识别码. 6.9 C 语言 getgid()函数:取得组识别码函数 相关函数:getegid, setregid, setgid 头文件:#include &unistd.h&#include &sys/types.h&定义函数:gid_t getgid(void); 函数说明:getgid()用来取得执行目前进程的组识别码。 返回值:返回组识别码 6.10 C 语言 getgrent()函数:从组文件中取得账号的数据 相关函数:setgrent, endgrent 头文件:#include &grp.h& #include &sys/types.h& 定义函数:struct group * getgrent(void); 函数说明: getgrent()用来从组文件(/etc/group)中读取一项组数据, 该数据以 group 结构返回. 第一次调用时会取得第一项组数据, 之后每调用一次就会返回下一项数据, 直到已无任何数 据时返回 NULL. struct group { char *gr_ //组名称 char *gr_ //组密码 gid_t gr_ //组识别码 char **gr_ //组成员账号 } 返回值:返回 group 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 附加说明:getgrent()在第一次调用时会打开组文件, 读取数据完毕后可使用 endgrent()来关 闭该组文件. 错误代码: ENOMEM:内存不足, 无法配置 group 结构。 6.11 C 语言 getgrgid()函数:从组文件中取得指定 gid 的数据 相关函数:fgetgrent, getgrent, getgrnam 头文件:#include &grp.h& #include &sys/types.h& 定义函数:strcut group * getgrgid(gid_t gid); 函数说明:getgrgid()用来依参数 gid 指定的组识别码逐一搜索组文件, 找到时便将该组的数 据以 group 结构返回. group 结构请参考 getgrent(). 返回值:返回 group 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.12 C 语言 getgrnam()函数:从组文件中取得指定组的数据 相关函数:fgetgrent, getrent, getgruid 头文件:#include &grp.h& #include &sys/types.h& 定义函数:strcut group * getgrnam(const char * name); 函数说明: getgrnam()用来逐一搜索参数那么指定的组名称, 找到时便将该组的数据以 group 结构返回。group 结构请参考 getgrent()。 返回值:返回 group 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.13 C 语言 getgroups()函数:获取组代码函数 相关函数:initgroups, setgroup, getgid, setgid 头文件:#include &unistd.h& #include &sys/types.h& 定义函数:int getgroups(int size, gid_t list[]); 函数说明:getgroup() 用来取得目前用户所属的组代码. 参数 size 为 list() 所能容纳的 gid_t 数目. 如果参数 size 值为零, 此函数仅会返回用户所属的组数。 返回值:返回组识别码, 如有错误则返回-1. 错误代码: EFAULT:参数 list 数组地址不合法. EINVAL:参数 size 值不足以容纳所有的组. 6.14 C 语言 getpw()函数:取得指定用户的密码文件数据 相关函数:getpwent 头文件:#include &pwd.h& #include &sys/types.h& 定义函数:int getpw(uid_t uid, char *buf); 函数说明: getpw()会从/etc/passwd 中查找符合参数 uid 所指定的用户账号数据, 找不到相关 数据就返回-1。 所返回的 buf 字符串格式如下: 账号:密码:用户识别码(uid):组识别码(gid):全名:根目录:shell 返回值:返回 0 表示成功, 有错误发生时返回-1. 附加说明 1. getpw()会有潜在的安全性问题, 请尽量使用别的函数取代。 2. 使用 shadow 的系统已把用户密码抽出/etc/passwd, 因此使用 getpw()取得的密码将为&x&。 6.15 C 语言 getpwent()函数:从密码文件中取得账号的数据 相关函数:getpw, fgetpwent, getpwnam, getpwuid, setpwent, endpwent 头文件:#include &pwd.h& #include &sys/types.h& 定义函数:strcut passwd * getpwent(void); 函数说明:getpwent()用来从密码文件(/etc/passwd)中读取一项用户数据, 该用户的数据以 passwd 结构返回. 第一次调用时会取得第一位用户数据, 之后每调用一次就会返回下一项 数据, 直到已无任何数据时返回 NULL。 passwd 结构定义如下: struct passwd { char * pw_ //用户账号 char * pw_ //用户密码 uid_t pw_ //用户识别码 gid_t pw_ //组识别码 char * pw_ //用户全名 char * pw_ //家目录 char * pw_ //所使用的 shell 路径 }; 返回值:返回 passwd 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 附加说明:getpwent()在第一次调用时会打开密码文件, 读取数据完毕后可使用 endpwent() 来关闭该密码文件。 错误代码: ENOMEM:内存不足, 无法配置 passwd 结构。 6.16 C 语言 getpwnam()函数:从密码文件中取得指定账号的数据 相关函数:getpw, fgetpwent, getpwent, getpwuid 头文件:#include &pwd.h& #include &sys/types.h& 定义函数:struct passwd * getpwnam(const char * name); 函数说明: getpwnam()用来逐一搜索参数 name 指定的账号名称, 找到时便将该用户的数据 以 passwd 结构返回。passwd 结构请参考 getpwent()。 返回值:返回 passwd 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.17 C 语言 getpwuid()函数:从密码文件中取得指定 uid 的数据 相关函数:getpw, fgetpwent, getpwent, getpwnam 头文件:#include &pwd.h& #include &sys/types.h& 定义函数:struct passwd * getpwuid(uid_t uid); 函数说明:getpwuid()用来逐一搜索参数 uid 指定的用户识别码, 找到时便将该用户的数据 以结构返回结构请参考将该用户的数据以 passwd 结构返回. passwd 结构请参考 getpwent()。 返回值:返回 passwd 结构数据, 如果返回 NULL 则表示已无数据, 或者有错误发生. 6.18 C 语言 getuid()函数:取得真实的用户识别码 相关函数:geteuid, setreuid, setuid 头文件:#include &unistd.h& #include &sys/types.h& 定义函数:uid_t getuid(void); 函数说明:getuid()用来取得执行目前进程的用户识别码。 返回值:用户识别码 6.19 C 语言 getutent()函数:从 utmp 文件中取得账号登录数据 相关函数:getutent, getutid, getutline, setutent, endutent, pututline, utmpname 头文件:#include &utmp.h& 定义函数:struct utmp *getutent(void); 函数说明: getutent()用来从 utmp 文件(/var/run/utmp)中读取一项登录数据, 该数据以 utmp 结构返回. 第一次调用时会取得第一位用户数据, 之后每调用一次就会返回下一项数据, 直 到已无任何数据时返回 NULL。 utmp 结构定义如下: struct utmp { short int ut_ //登录类型 pid_t ut_ //login 进程的 pid char ut_line[UT_LINESIZE]; //登录装置名, 省略了&/dev/& char ut_id[4]; //Inittab ID char ut_user[UT_NAMESIZE]; //登录账号 char ut_host[UT_HOSTSIZE]; //登录账号的远程主机名称 struxt exit_status ut_ //当类型为 DEAD_PROCESS 时进程的结束状态 long int ut_ //Sessioc ID struct timeval ut_ //时间记录 int32_t ut_addr_v6[4]; //远程主机的网络地址 char __unused[20]; //保留未使用 }; ut_type 有以下几种类型: EMPTY:此为空的记录. RUN_LVL:记录系统 run-level 的改变 BOOT_TIME:记录系统开机时间 NEW_TIME:记录系统时间改变后的时间 OLD_TINE:记录当改变系统时间时的时间. INIT_PROCESS:记录一个由 init 衍生出来的进程. LOGIN_PROCESS:记录 login 进程. USER_PROCESS:记录一般进程. DEAD_PROCESS:记录一结束的进程. ACCOUNTING:目前尚未使用. exit_status 结构定义: struct exit_status { short int e_ //进程结束状态 short int e_ //进程退出状态 }; timeval 的结构定义请参考 gettimeofday()。 相关常数定义如下: UT_LINESIZE 32 UT_NAMESIZE 32 UT_HOSTSIZE 256 返回值:返回 utmp 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 附加说明:getutent()在第一次调用时会打开 utmp 文件, 读取数据完毕后可使用 endutent() 来关闭该 utmp 文件. 6.20 C 语言 getutid()函数:从 utmp 文件中查找特定的记录 相关函数:getutent, getutline 头文件:#include &utmp.h& 定义函数:strcut utmp *getutid(strcut utmp *ut); 函数说明: getutid()用来从目前 utmp 文件的读写位置逐一往后搜索参数 ut 指定的记录。 1 、如果 ut-&ut_type 为 RUN_LVL, BOOT_TIME, NEW_TIME, OLD_TIME 其中之一则查找与 ut-&ut_type 相符的记录; 2、若 ut-&ut_type 为 INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS 或 DEAD_PROCESS 其中 之一, 则查找与 ut-&ut_id 相符的记录. 找到相符的记录便将该数据以 utmp 结构返回. utmp 结构请参考 getutent()。 返回值:返回 utmp 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.21 C 语言 getutline()函数:文件查找函数(从 utmp 文件中查找特定的 相关函数:getutent, getutid, pututline 头文件:#include &utmp.h& 定义函数:struct utmp * getutline(struct utmp *ut); 函 数 说 明 : getutline() 用 来 从 目 前 utmp 文 件 的 读 写 位 置 逐 一 往 后 搜 索 ut_type 为 USER_PROCESS 或 LOGIN_PROCESS 的记录, 而且 ut_line 和 ut-&ut_line 相符. 找到相符的记 录便将该数据以 utmp 结构返回, utmp 结构请参考 getutent()。 返回值:返回 utmp 结构数据, 如果返回 NULL 则表示已无数据, 或有错误发生. 6.22 C 语言 initgroups()函数:初始化组清单 相关函数:setgrent, endgrent 头文件:#include &grp.h& #include &sys/types.h& 定义函数:int initgroups(const char *user, gid_t group); 函数说明:initgroups()用来从组文件(/etc/group)中读取一项组数据, 若该组数据的成员中有 参数 user 时, 便将参数 group 组识别码加入到此数据中。 返回值:执行成功则返回 0, 失败则返回-1, 错误码存于 errno. 6.23 C 语言 pututline()函数:将 utmp 记录写入文件 相关函数:getutent, getutid, getutline 头文件:#include &utmp.h& 定义函数:void pututline(struct utmp *ut); 函数说明: pututline() 用来将参数 ut 的 utmp 结构记录到 utmp 文件中 . 此函数会先用 getutid()来取得正确的写入位置, 如果没有找到相符的记录则会加入到 utmp 文件尾, utmp 结构请参考 getutent()。 附加说明:需要有写入/var/run/utmp 的权限 6.24 C 语言 seteuid()函数:设置有效的用户识别码 相关函数:setuid, setreuid, setfsuid 头文件:#include &unistd.h& 定义函数:int seteuid(uid_t euid); 函数说明: seteuid()用来重新设置执行目前进程的有效用户识别码. 在 Linux 下, seteuid(euid) 相当于 setreuid(-1, euid)。 返回值:执行成功则返回 0, 失败则返回-1, 错误代码存于 errno 附加说明:请参考 setuid 6.25 C 语言 setfsgid()函数:设置文件系统的组识别码 相关函数:setuid, setreuid, seteuid, setfsuid 头文件:#include &unistd.h& 定义函数:int setfsgid(uid_t fsgid); 函数说明:setfsgid()用来重新设置目前进程的文件系统的组识别码. 一般情况下, 文件系统 的组识别码(fsgid)与有效的组识别码(egid)是相同的. 如果是超级用户调用此函数, 参数 fsgid 可以为任何值,否则参数 fsgid 必须为 real/effective/saved 的组识别码之一. 返回值:执行成功则返回 0, 失败则返回-1, 错误代码存于 errno. 附加说明:此函数为 Linux 特有. 错误代码: EPERM:权限不够, 无法完成设置. 6.26 C 语言 setfsuid()函数:设置文件系统的用户识别码 相关函数:setuid, setreuid, seteuid, setfsgid 头文件:#include &unistd.h& 定义函数:int setfsuid(uid_t fsuid); 函数说明:setfsuid()用来重新设置目前进程的文件系统的用户识别码. 一般情况下, 文件系 统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的. 如果是超级用户调用此函数, 参 数 fsuid 可以为任何值, 否则参数 fsuid 必须为 real/effective/saved 的用户识别码之一. 返回值: 执行成功则返回 0, 失败则返回-1, 错误代码存于 errno 附加说明此函数为 Linux 特 有 错误代码: EPERM:权限不够, 无法完成设置. 6.27 C 语言 setgid()函数:设置真实的组识别码 相关函数:getgid, setregid, getegid, setegid 头文件:#include &unistd.h& 定义函数:int setgid(gid_t gid); 函数说明:setgid()用来将目前进程的真实组识别码(real gid)设成参数 gid 值. 如果是以超级 用户身份执行此调用, 则 real、effective 与 savedgid 都会设成参数 gid。 返回值:设置成功则返回 0, 失败则返回-1, 错误代码存于 errno 中. 错误代码: EPERM:并非以超级用户身份调用, 而且参数 gid 并非进程的 effective gid 或 saved gid 值之一. 6.28 C 语言 setgrent()函数:从头读取组文件中的组数据 相关函数:getgrent, endgrent 头文件:#include &grp.h& #include &sys/types.h& 定义函数:void setgrent(void); 函数说明:setgrent()用来将 getgrent()的读写地址指回组文件开头。 附加说明:请参考 setpwent(). 6.29 C 语言 setgroups()函数:设置组代码函数 相关函数:initgroups, getgroup, getgid, setgid 头文件:#include &grp.h& 定义函数:int setgroups(size_t size, const gid_t * list); 函数说明:setgroups()用来将 list 数组中所标明的组加入到目前进程的组设置中. 参数 size 为 list()的 gid_t 数目, 最大值为 NGROUP(32)。 返回值:设置成功则返回 0, 如有错误则返回-1. 错误代码: EFAULT:参数 list 数组地址不合法. EPERM:权限不足, 必须是 root 权限 EINVAL:参数 size 值大于 NGROUP(32). 6.30 C 语言 setpwent()函数:从头读取密码文件中的账号数据 相关函数:getpwent, endpwent 头文件:#include &pwd.h& #include &sys/types.h& 定义函数:void setpwent(void); 函数说明:setpwent()用来将 getpwent()的读写地址指回密码文件开头。 6.31 C 语言 setregid()函数:设置真实及有效的组识别码 相关函数:setgid, setegid, setfsgid 头文件:#include &unistd.h& 定义函数:int setregid(gid_t rgid, gid_t egid); 函数说明:setregid()用来将参数 rgid 设为目前进程的真实组识别码, 将参数 egid 设置为目 前进程的有效组识别码. 如果参数 rgid 或 egid 值为-1, 则对应的识别码不会改变。 返回值:执行成功则返回 0, 失败则返回-1, 错误代码存于 errno. 6.32 C 语言 setreuid()函数:设置真实及有效的用户识别码 相关函数:setuid, seteuid, setfsuid 头文件:#include &unistd.h& 定义函数:int setreuid(uid_t ruid, uid_t euid); 函数说明:setreuid()用来将参数 ruid 设为目前进程的真实用户识别码, 将参数 euid 设置为 目前进程的有效用户识别码. 如果参数 ruid 或 euid 值为-1, 则对应的识别码不会改变。 返回值:执行成功则返回 0, 失败则返回-1, 错误代码存于 errno. 附加说明:请参考 setuid(). 6.33 C 语言 setuid()函数:设置真实的用户识别码 相关函数:getuid, setreuid, seteuid, setfsuid 头文件:#include &unistd.h& 定义函数:int setuid(uid_t uid); 函数说明: setuid()用来重新设置执行目前进程的用户识别码. 不过, 要让此函数有作用, 其有效的用户 识别码必须为 0(root). 在 Linux 下, 当 root 使用 setuid()来变换成其他用户识别码时, root 权限会被抛弃, 完全转换成该用户身份, 也就是说, 该进程往后将不再具有可 setuid()的权利, 如果只是向暂时抛弃 root 权限, 稍后想重新取回权限, 则必须使用 seteuid(). 返回值:执行成功则返回 0, 失败则返回-1, 错误代码存于 errno. 附加说明: 一般在编写具 setuid root 的程序时, 为减少此类程序带来的系统安全风险, 在使 用完 root 权限后建议马上执行 setuid(getuid());来抛弃 root 权限. 此外, 进程 uid 和 euid 不 一致时 Linux 系统将不会产生 core dump. 6.34 C 语言 setutent()函数:从头读取 utmp 文件中的登录数据 相关函数:getutent, endutent 头文件:#include &utmp.h& 定义函数:void setutent(void); 函数说明:setutent()用来将 getutent()的读写地址指回 utmp 文件开头。 附加说明:请参考 setpwent()或 setgrent(). 6.35 C 语言 utmpname()函数:设置文件路径 相关函数:getutent, getutid, getutline, setutent, endutent, pututline 头文件:#include &utmp.h& 定义函数:void utmpname(const char * file); 函数说明:utmpname()用来设置 utmp 文件的路径, 以提供 utmp 相关函数的存取路径. 如 果没有使用 utmpname()则默认 utmp 文件路径为/var/run/utmp。 6.36 C 语言 close()函数:关闭文件 相关函数:open, fcntl, shutdown, unlink, fclose 头文件:#include &unistd.h& 定义函数:int close(int fd); 函数说明: 当使用完文件后若已不再需要则可使用 close()关闭该文件, 二 close()会让数据写 回磁盘, 并释放该文件所占用的资源. 参数 fd 为先前由 open()或 creat()所返回的文件描述 词. 返回值:若文件顺利关闭则返回 0, 发生错误时返回-1. 错误代码:EBADF 参数 fd 非有效的文件描述词或该文件已关闭. 附加说明:虽然在进程结束时, 系统会自动关闭已打开的文件, 但仍建议自行关闭文件, 并 确实检查返回值. 6.37 C 语言 creat()函数:创建文件函数 相关函数:read, write, fcntl, close, link, stat, umask, unlink, fopen 头文件:#include &sys/types.h& #include &sys/stat.h& #include &fcntl.h& 定义函数:int creat(const char * pathname, mode_tmode); 函数说明: 1、参数 pathname 指向欲建立的文件路径字符串。 2、Creat()相当于使用下列的调用方式调用 open() open(const char * pathname, (O_CREAT|O_WRONLY|O_TRUNC)); 错误代码:关于参数 mode 请参考 open()函数. 返回值: creat()会返回新的文件描述词, 若有错误发生则会返回-1, 并把错误代码设给 errno. EEXIST 参数:pathname 所指的文件已存在. EACCESS 参数:pathname 所指定的文件不符合所要求测试的权限 EROFS:欲打开写入权限的文件存在于只读文件系统内 EFAULT 参数:pathname 指针超出可存取的内存空间 EINVAL 参数:mode 不正确. ENAMETOOLONG 参数:pathname 太长. ENOTDIR 参数:pathname 为一目录 ENOMEM :核心内存不足 ELOOP 参数:pathname 有过多符号连接问题. EMFILE:已达到进程可同时打开的文件数上限 ENFILE:已达到系统可同时打开的文件数上限 附加说明:creat()无法建立特别的装置文件, 如果需要请使用 mknod(). 6.38 C 语言 dup()函数:复制文件描述词 相关函数:open, close, fcntl, dup2 头文件:#include &unistd.h& 定义函数:int dup (int oldfd); 函数说明:dup()用来复制参数 oldfd 所指的文件描述词, 并将它返回. 此新的文件描述词和 参数 oldfd 指的是同一个文件, 共享所有的锁定、读写位置和各项权限或旗标. 例如, 当利 用 lseek()对某个文件描述词作用时, 另一个文件描述词的读写位置也会随着改变. 不过, 文 件描述词之间并不共享 close-on-exec 旗标. 返回值:当复制成功时, 则返回最小及尚未使用的文件描述词. 若有错误则返回-1, errno 会 存放错误代码. 错误代码:EBADF 参数 fd 非有效的文件描述词, 或该文件已关闭. 6.39 C 语言 dup2()函数:复制文件描述词 相关函数:open, close, fcntl, dup 头文件:#include &unistd.h& 定义函数:int dup2(int odlfd, int newfd); 函数说明:dup2()用来复制参数 oldfd 所指的文件描述词, 并将它拷贝至参数 newfd 后一块 返回. 若参数 newfd 为一已打开的文件描述词, 则 newfd 所指的文件会先被关闭. dup2() 所 复制的文件描述词, 与原来的文件描述词共享各种文件状态, 详情可参考 dup(). 返回值:当复制成功时, 则返回最小及尚未使用的文件描述词. 若有错误则返回-1, errno 会 存放错误代码. 附加说明:dup2()相当于调用 fcntl(oldfd, F_DUPFD, newfd); 请参考 fcntl(). 错误代码:EBADF 参数 fd 非有效的文件描述词, 或该文件已关闭 6.40 C 语言 fcntl()函数:文件描述词操作函数 相关函数:open, flock 头文件:#include &unistd.h& 定义函数: int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock * lock); 函数说明: 1、fcntl()用来操作文件描述词的一些特性. 。 2、参数 fd 代表欲设置的文件描述词, 。 3、参数 cmd 代表欲操作的指令。有以下几种情况: F_DUPFD 用来查找大于或等于参数 arg 的最小且仍未使用的文件描述词, 并且复制参数 fd 的文件描述词. 执行成功则返回新复制的文件描述词. 请参考 dup2(). F_GETFD 取得 closeon-exec 旗标. 若此旗标的 FD_CLOEXEC 位为 0, 代表在调用 exec()相关函数时文件将不会关闭. F_SETFD 设置 close-on-exec 旗标. 该旗标以参数 arg 的 FD_CLOEXEC 位决定. F_GETFL 取得文件描述词状态旗标, 此旗标为 open()的参数 flags. F_SETFL 设置文件描述词状态旗标, 参数 arg 为新旗标, 但只允许 O_APPEND 、 O_NONBLOCK 和 O_ASYNC 位的改变, 其他位的改变将不受影响. F_GETLK 取得文件锁定的状态. F_SETLK 设置文件锁定的状态. 此时 flcok 结构的 l_type 值必须是 F_RDLCK、F_WRLCK 或 F_UNLCK. 如果无法建立锁定, 则返回-1, 错误代码为 EACCES 或 EAGAIN. F_SETLKW 同 F_SETLK 作用相同, 但是无法建立锁定时, 此调用会一直等到锁定动作成功为 止. 若在等待锁定的过程中被信号中断时, 会立即返回-1, 错误代码为 EINTR. 参数 lock 指 针为 flock 结构指针, 定义如下 #include &fcntl.h& struct flcok { short int l_ //锁定的状态 short int l_ //决定 l_start 位置 off_t l_ //锁定区域的开头位置 off_t l_ //锁定区域的大小 pid_t l_ //锁定动作的进程 }; l_type 有三种状态: F_RDLCK 建立一个供读取用的锁定 F_WRLCK 建立一个供写入用的锁定 F_UNLCK 删除之前建立的锁定 l_whence 也有三种方式: SEEK_SET 以文件开头为锁定的起始位置. SEEK_CUR 以目前文件读写位置为锁定的起始位置 SEEK_END 以文件结尾为锁定的起始位置. 返回值:成功则返回 0, 若有错误则返回-1, 错误原因存于 errno. 6.41 C 语言 flock()函数:解除锁定文件 相关函数:open, fcntl 头文件:#include &sys/file.h& 定义函数:int flock(int fd, int operation); 函数说明: flock()会依参数 operation 所指定的方式对参数 fd 所指的文件做各种锁定或解除 锁定的动作. 此函数只能锁定整个文件, 无法锁定文件的某一区域. 参数 operation 有下列四种情况: LOCK_SH 建立共享锁定. 多个进程可同时对同一个文件作共享锁定. LOCK_EX 建立互斥锁定. 一个文件同时只有一个互斥锁定. LOCK_UN 解除文件锁定状态. LOCK_NB 无 法 建 立 锁 定 时 , 此 操 作 可 不 被 阻 断 , 马 上 返 回 进 程 . 通 常 与 LOCK_SH 或 LOCK_EX 做 OR(|)组合. 单一文件无法同时建立共享锁定和互斥锁定, 而当使用 dup()或 fork()时文件描述词不会继承 此种锁定. 返回值:返回 0 表示成功, 若有错误则返回-1, 错误代码存于 errno. 6.42 C 语言 fsync()函数:将缓冲区数据写回磁盘 相关函数:sync 头文件:#include &unistd.h& 定义函数:int fsync(int fd); 函数说明: fsync()负责将参数 fd 所指的文件数据, 由系统缓冲区写回磁盘, 以确保数据同步. 返回值:成功则返回 0, 失败返回-1, errno 为错误代码. 6.43 C 语言 lseek()函数:移动文件的读写位置 相关函数:dup, open, fseek 头文件:#include &sys/types.h& #include &unistd.h& 定义函数:off_t lseek(int fildes, off_t offset, int whence); 函数说明: 每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若 是以附加的方式打开文件(如 O_APPEND), 则读写位置会指向文件尾. 当 read()或 write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数 fildes 为已打开的文件描 述词, 参数 offset 为根据参数 whence 来移动读写位置的位移数. 参数 whence 为下列其中一种: SEEK_SET 参数 offset 即为新的读写位置. SEEK_CUR 以目前的读写位置往后增加 offset 个位移量. SEEK_END 将读写位置指向文件尾后再增加 offset 个位移量. 当 whence 值为 SEEK_CUR 或 SEEK_END 时, 参数 offet 允许负值的出现. 下列是教特别的使用方式: 1) 欲将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET); 2) 欲将读写位置移到文件尾时:lseek(int fildes, 0, SEEK_END); 3) 想要取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR); 返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 若有错误 则返回-1, errno 会存放错误代码. 附加说明:Linux 系统不允许 lseek()对 tty 装置作用, 此项动作会令 lseek()返回 ESPIPE. 6.44 C 语言 mkstemp()函数:建立临时文件 相关函数:mktemp 头文件:#include &stdlib.h& 定义函数:int mkstemp(char * template); 函数说明:mkstemp()用来建立唯一的临时文件. 参数 template 所指的文件名称字符串中最 后六个字符必须是 XXXXXX. Mkstemp()会以可读写模式和 0600 权限来打开该文件, 如果该 文件不存在则会建立该文件. 打开该文件后其文件描述词会返回. 文件顺利打开后返回可读 写的文件描述词. 若果文件打开失败则返回 NULL, 并把错误代码存在 errno 中. 错误代码: EINVAL 参数 template 字符串最后六个字符非 XXXXXX. EEXIST 无法建立临时文件. 附加说明: 参数 template 所指的文件名称字符串必须声明为数组, 如: char template[] = &template-XXXXXX&; 千万不可以使用下列的表达方式 char *template = &template-XXXXXX&; 6.45 C 语言 open()函数:打开文件函数 相关函数:read, write, fcntl, close, link, stat, umask, unlink, fopen 头文件:#i

我要回帖

更多关于 c语言读取txt文件数据 的文章

 

随机推荐