for(vector::iterator it=arr.begin(); it!=arr.end(); )
{
if(*it == 8)
{
it = arr.erase(it);
}
else
{
++it;
}
}
cout << "After remove 8:\n";
for(vector::iterator it = arr.begin(); it < arr.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
[omcbo@DGSERNMC111 C]$ ./vector2
before remove 8:
6 8 3 8
After remove 8:
6 3
###############################################################################
access(判断是否具有存取文件的权限)
相关函数 stat,open,chmod,chown,setuid,setgid
表头文件 #include
定义函数 int access(const char * pathname,int mode);
函数说明 access()会检查是否可以读/写某一已存在的文件。参数mode有几种情况组合,
R_OK,W_OK,X_OK 和F_OK。R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。
F_OK则是用来判断该文件是否存在。由于access()只作权限的核查,并不理会文件形态或文件内容,
因此,如果一目录表示为“可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。
例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行时则会失败。
返回值 若所有欲查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1。
错误代码 EACCESS 参数pathname 所指定的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname为一目录。
ENOMEM 核心内存不足
ELOOP 参数pathname有过多符号连接问题。
EIO I/O 存取错误。
附加说明 使用access()作用户认证方面的判断要特别小心,
例如在access()后再做open()的空文件可能会造成系统安全上的问题。
范例 /* 判断是否允许读取/etc/passwd */
#include
int main()
{
if (access(“/etc/passwd”,R_OK) = =0)
printf(“/etc/passwd can be read\n”);
}
执行 /etc/passwd can be read
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
assert宏的原型定义在
中,其作用是如果它的条件返回错误,则终止程序执行,
#include
#include
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp ); //所以这里不会出错
fclose( fp );
fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp ); //所以这里出错
fclose( fp ); //程序永远都执行不到这里来
return 0;
}
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.
已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include
的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include
#define NDEBUG
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
函数: strcpy
原型: char * strcpy( char* _Dest, const char *_Source );
功能: 复制源串_Source到目标串_Dest所指定的位置,
包含NULL结束符. 不能处理源串与目标串重叠的情况.
函数返回_Dest值.
*/
char * strcpy( char *_Dest, const char *_Source )
{
assert( ( NULL != _Dest ) && ( NULL != _Source ) );
char *_Temp = _Dest;
while ( ( *_Temp++ = *_Source++ ) != '/0' );
return _Dest;
}
/*
函数: strlen的实现代码
功能: size_t strlen( const char *_Str );
功能: 获取字符串长度, 字符串结束符NULL不计算在内.
没有返回值指示操作错误.
*/
size_t strlen( const char *_Str )
{
assert( _Str != NULL );
size_t _Size = 0;
while ( *_Str++ )
{
_Size++;
}
return _Size;
}
/*
函数: strcat
原型: char * strcat( char *_Dest, const char *_Source );
功能: 将源串_Src字符添加到目标串_Dst后.
本函数不能处理源串与目标串重叠的情况.
*/
char * strcat( char *_Dest, const char *_Source )
{
assert( ( NULL != _Dest ) && ( NULL != _Source ) );
char *_Temp = _Dest;
while ( ( *++_Temp ) != NULL );
while ( ( *_Temp++ = *_Source++ ) != NULL );
return _Dest;
}
/*
函数: strcmp
原型: int strcmp( const char *_Str1, const char *_Str2 );
功能: 比较字符串_Str1和_Str2大小.
返回值< 0, 表示_Str1小于_Str2;
返回值为0, 表示_Str1等于_Str2;
返回值> 0, 表示_Str1大于_Str2.
*/
int strcmp( const char *_Str1, const char *_Str2 )
{
assert( ( NULL != _Str1 ) && ( NULL != _Str2 ) );
for ( ; *_Str1 == *_Str2; _Str1++, _Str2++ )
{
if ( ( '/0' == *_Str1 ) || ( '/0' == *_Str2 ) )
{
if ( *_Str1 == *_Str2 )
{
return 0;
}
else
{
break;
}
}
}
return ( ( *_Str1 > *_Str2 ) ? 1 : -1 );
}
/*
函数: strlwr的实现代码
功能: char * strlwr( char *_Str );
功能: 将字符串_Str的大写转换成小写并输出.
*/
char * strlwr( char *_Str )
{
assert( NULL != _Str );
char *_Temp = _Str;
do
{
if ( ( *_Temp >= 'A' ) && ( *_Temp <= 'Z' ) )
{
*_Temp += 32;
}
}while( ( *_Temp++ ) != '/0' );
return _Str;
}
/*
函数: strupr的实现代码
功能: char * strupr( char *_Str );
功能: 将字符串_Str的小写转换成大写并输出.
*/
char * strupr( char *_Str )
{
assert( NULL != _Str);
char *_Temp = _Str;
do
{
if ( ( *_Temp >= 'a' ) && ( *_Temp <= 'z' ) )
{
*_Temp -= 32;
}
}while( ( *_Temp++ ) != '/0' );
return _Str;
}
/*
函数: strrev的实现代码
功能: char * strrev( char *_Str );
功能: 将字符串_Str倒转并输出.
*/
char * strrev( char *_Str )
{
assert( NULL != _Str );
char *_Str1 = _Str;
char *_Str2 = _Str;
char _Temp;
while ( *_Str2 != '/0' )
{
*_Str2++;
}
if( _Str1 != _Str2 )
{
_Str2--;
}
while ( _Str1 < _Str2 )
{
_Temp = *_Str1;
*_Str1 = *_Str2;
*_Str2 = _Temp;
*_Str1++;
*_Str2--;
}
return _Str;
}
/*
函数: strchr的实现代码
功能: const char * strchr( const char *_Str, int _Val );
功能: 函数返回一个指向Str中_Val首次出现的位置,当没有在_Str中找_Val到返回NULL。
*/
const char * strchr( const char *_Str, int _Val )
{
assert( NULL != _Str );
for ( ; *_Str != (char)_Val; ++_Str )
{
if ( *_Str == '/0' )
{
return (const char *)NULL;
}
}
return _Str;
}
/*
函数: strpbrk的实现代码
功能: char * strpbrk( char *_Str, const char *_Control );
功能: 函数返回一个指针,它指向字符串_Control中任意字符在字符串_Str首次出现的位置,如果不存在返回NULL.
*/
char * strpbrk( char *_Str, const char *_Control )
{
assert( ( NULL != _Str ) && ( NULL != _Control ) );
char *_Str1;
const char *_Str2;
for ( _Str1 = _Str; *_Str1 != '/0'; ++_Str1 )
{
for ( _Str2 = _Control; *_Str2 != '/0'; ++_Str2 )
{
if ( *_Str1 == *_Str2 )
{
return _Str1;
}
}
}
return (char*)NULL;
}
/*
函数: strstr的实现
原型: char * strstr( char *_Str, const char *_SubStr );
功能: 在字符串_Str中查找_SubStr子串.
返回子串_SubStr在_Str中首次出现位置的指针.
如果没有找到子串_SubStr,
则返回NULL. 如果子串_SubStr为空串, 函数
返回_Str值.
*/
char * strstr( char *_Str, const char *_SubStr )
{
assert( ( NULL != _Str ) && ( NULL != _SubStr ) );
unsigned int i = 0;
if ( 0 == *_Str )
{
if ( *_SubStr )
{
return (char*)NULL;
}
return _Str;
}
while ( *_Str )
{
i = 0;
while (1)
{
if ( 0 == _SubStr[i] )
{
return _Str;
}
if ( _SubStr[i] != _Str[i] )
{
break;
}
i++;
}
_Str++;
}
return (char*)NULL;
}
/*
函数: strtok的实现代码
功能: char * strtok( char *_Str, const char *_Delim );
功能: 查找由_Delim指定分界符对_Str进行分解.首次调用_str指向要分解的字符串,以后调用_Str为NULL.
*/
char * strtok( char *_Str, const char *_Delim )
{
static char *_Begin;
if ( NULL != _Str )
{
_Begin = strstr( _Str, _Delim );
while ( _Begin == _Str )
{
_Str += strlen( _Delim );
_Begin = strstr( _Str, _Delim );
}
}
else
{
_Str = _Begin;
if ( NULL == _Str )
{
return NULL;
}
_Begin = strstr( _Str, _Delim );
while ( _Begin == _Str )
{
_Str += strlen( _Delim );
_Begin = strstr( _Str, _Delim );
}
}
if ( NULL != _Begin )
{
memset( _Begin, 0, strlen( _Delim ) );
_Begin += strlen( _Delim );
}
else if ( 0 == *_Str )
{
return NULL;
}
return _Str;
}