access()函数
:判断是否具有存取文件的权限
头文件:#include <unistd.h>
定义函数:int access(const char *
pathname, int mode);
函数说明:access()会检查是否可以读/写某一已存在的文件。
参数mode 有几种情况组合:
1、R_OK, W_OK, X_OK和F_OK. R_OK, W_OK 与X_OK 用来检查文件是否具有读娶写入和执行的权限。
2、F_OK 则是用来判断该文件是否存在。由于access()只作权限的核查, 并不理会文件形态或文件内容,因此,如果一目录表示为"可写入",表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如:你会发现DOS 的文件都具有"可执行"权限,但用execve()执行时则会失败。
返回值:若所有欲查核的权限都通过了检查则返回0 值,表示成功,只要有一权限被禁止则返回-1。
错误代码:
1、EACCESS 参数pathname 所指定的文件不符合所要求测试的权限.
2、EROFS 欲测试写入权限的文件存在于只读文件系统内.
3、EFAULT 参数pathname 指针超出可存取内存空间.
4、EINVAL 参数mode 不正确.
5、ENAMETOOLONG 参数pathname 太长.
6、ENOTDIR 参数pathname 为一目录.
7、ENOMEM 核心内存不足
8、ELOOP 参数pathname 有过多符号连接问题.
9、EIO I/O 存取错误.
附加说明:使用 access()作用户认证方面的判断要特别小心, 例如在access()后再做open()的空文件可能会造成系统安全上的问题.
atoi 函数获取一个 C 字符串参数,返回与之对应的 int 值。
例如,atoi(“1234”)返回
整数 1234。如果参数不对应一个 int 值,atoi 就返回 0。例如,atoi("#37")会返回 0,
因为字符’#'并非数字。atoi 要念成“A to
I”,是“alphabetic to integer”的缩写。
atoi 函数在头文件为 cstdlib 的库中,所以要想在程序中使用该函数,必须包括以下预编译
#include
如果数字太大,不能转换成 int 类型的值,可考虑把它们从 C 字符串转换成 long 类型
的值。atol 函数可执行与 atoi 函数相同的转换,只是 atol 返回 long 值,能支持更大的整数
将 C 字符串转换成数值的函数
atoi,atol 和 atof 函数将数字构成的 C 字符串转换成对应的数值。atoi 和 atol
将 C 字符串转换成整数。atoi 和 atol 唯一的区别是 atoi 返回 int 值,而 atol 返回
long 值。atof 将 C 字符串转换成
double 值。如果 C 字符串实参无法转换成数字,这
些函数会返回 0。
例如:
int x = atoi(“657”);
将 x 的值设为 657,而
double y = atof(“12.37”);
将 y 的值设为 12.37。使用了这些函数的程序必须包含以下预编译指令:
#include
snprintf()函数
int snprintf(char *restrict buf, size_t n,
const char * restrict format, …);
函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n
的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
strcmp()判断两个字符串是否相等
#include “stdafx.h”
#include<stdio.h>
#include<string.h>
#include
#include <iostream.h>
//int strcmp(const char *str1,const char *str2);
using namespace std;
int _tmain(int argc, _TCHAR*
argv[])
{
char *s1=“Hello,Programmers!”;
char *s2="Hello,programmers!";
int r;
clrscr();
cout<<"dddd"<<endl
r = strcmp(s1,s2);
if(!r){
cout<<"dddd"<<endl
printf("s1 and s2 are identical");
}else if(r<0){
printf("s1 less than s2");
}else{
printf("s1 greater than s2");
} getchar();
return 0;
}
/*int strcmp(const char *str1,const char *str2)
{
/*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++,
return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/
while(*str1
== *str2)
{
if(*str1
== ‘\0’)
return0;
str1++;
str2++;
}
return *str1 - *str2;
}*/
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 的值。
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR*
argv[])
{
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a,
b) : %d\n",
strcmp(a, b));
printf("strcmp(a,
c) : %d\n",
strcmp(a, c));
printf("strcmp(a,
d) : %d\n",
strcmp(a, d));
/*输出结果:
strcmp(a, b)
: 1
strcmp(a, c)
: -1
strcmp(a, d)
: 0*/
return 0;
}
strcat()函数用于连接两个 C 字符串
函数用于连接两个 C 字符串;换言之,它使两个较短的 C 字符串首尾相连,从而构成一个较长的。第一个参数必须是 C 字符串变量。第二个参数可以是最终求值为 C 字符串值的任何东西,比如一个引号字符串
memcpy()可以复制任意内容,例如字符数组、整型、结构体、类等
/*#include “stdafx.h”
#include
#include
using namespace std;
//内存拷贝函数: EXTERN void *memcpy(void *dest, const void *src, size_t
n);
// memcpy可以复制任意内容,例如字符数组、整型、结构体、类等
int _tmain(int argc, _TCHAR* argv[])
{
//将s中的字符串复制到字符数组d中
/*char*
s=“GoldenGlobalView”;
char d[20];
memcpy(d,s,(strlen(s)+1));
printf("%s",d);//GoldenGlobalView
getchar();*/
//作用:将s中的字符串复制到字符数组d中
/*char*
s=“GoldenGlobalView”;
char d[20];
memcpy(d,s+12,4);//从第13个字符(V)开始复制,连续复制4个字符(View)
d[4]='\0';//memcpy(d,s+12*sizeof(char),4*sizeof(char));也可
printf("%s",d);//View
getchar();*/
//作用:复制后覆盖原有部分数据
char src[]="******************************";
char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
printf("destination
before memcpy:%s\n",dest);
memcpy(dest,src,strlen(src));
printf("destination
after memcpy:%s\n",dest);
//destination
after memcpy:******************************as6
return 0;
}*/
memset函数使用详解
/*void
*memset(void *s, int c, size_t n);
总的作用:将已开辟内存空间 s 的首
n 个字节的值设为值 c。
memset() 函数常用于内存空间初始化。
memset可以方便的清空一个结构类型的变量或数组。
#include “stdafx.h”
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char
buffer[]=“Helloworld\n”;
printf("Buffer
before memset:%s\n",buffer); //Buffer before memset:Helloworld
memset(buffer,0,strlen(buffer));
printf("Buffer
after memset:%s\n",buffer); //Buffer after memset:
return
0;
}*/
C++双冒号::的作用
1.作用域符号::的前面一般是类名称,后面一般是该类的成员名称
如:A,B表示两个类,在A,B中都有成员member。那么
A::member就表示类A中的成员member
B::member就表示类B中的成员member
2.全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如:
char
zhou; //全局变量
void sleep()
{
char
zhou; //局部变量
char(局部变量) = char(局部变量) *char(局部变量) ;
::char(全局变量) =::char(全局变量) *char(局部变量);
}
::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如
class CA {
public:
int ca_var;
int add(int a, int b);
int add(int a);
};
//那么在实现这个函数时,必须这样书写:
int CA::add(int a, int b)
{
return a + b;
}
//另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:
int CA::add(int a)
{
return a + ::ca_var;
}
//表示当前类实例中的变量ca_var。