strtok
字符分隔函数最好使用 strsep 而最好不要使用strtok,
第一个参数源字符串一定为字符串数组变量,不能是字符串常量。因为字符串常量禁止修改!!
头文件:#include <string.h>
声明:char *strtok(char *str, const char *delim);
参数及返回值
源字符串数组指针,分隔符字符串指针;
放回值为指向被分割的子串的指针
函数功能:
对字符串s,以delim为分隔符将s切分为一个个子串
实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
char* nbaName = "jordan,james,kobe,curry";
char cbaName[] = "yaoMing,yijianLian,wangzhiZhi,zhouQi";
char *ptr = NULL;
char name[32] = {0};
// for(ptr=strtok(nbaName,","); ptr; ptr=strtok(NULL,",")) // error
for(ptr=strtok(cbaName,","); ptr; ptr=strtok(NULL,",")) // right
printf("%s\n", ptr);
memcpy(name, nbaName, strlen(nbaName));
for(ptr=strtok(name,","); ptr; ptr=strtok(NULL,","))
printf("%s\n", ptr);
return 0;
}
access
linux头文件 : <unistd.h>
声明 : int access ( const char * pathname , int mode)
作用 : 该函数同来判断指定文件或者目录是否有mode对应的属性. 有效返回0, 否则返回-1
参数介绍:
pathname 时文件的路径名字 + 文件名
mode value meaning F_OK 0 判断文件是否存在 X_OK 1 判断文件是否有可执行权限 W_OK 2 判断文件是否有写权限 R_OK 3 判断文件是否有读权限 后面三种可以通过“ | ”的方式一起使用,例如 : W_OK | X_OK
windows头文件 : <io.h>
声明 : int _access(const char* _Filename, int _AccessMode);
使用与linux同, 存在(00)、仅读(04)、仅写(02)、既可读又可写(06)权限
如果mode传入的值不是0或2或4或6,调用此函数则会crash
c_str( )
c++ 头文件 :
声明 : const char* c_str() const
返回值:
c_str()函数返回一个指向C字符串的指针常量,即是const char*的,不能直接赋值给char*
这将与c语言兼容,c_str()把string 对象转换成c中的字符串样式使用方式
1
2
3char c[20];
string s="1234";
strcpy(c,s.c_str());
strtoul( )
- c头文件<stdlib.h>
声明:unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr,int base);
参数及返回值
- 参数nptr:字符串的起始地址
- 参数endptr: 返回字符串有效数字的结尾地址。如 123456fe789 则返回数字f的地址。
- 参数base:转化基数。参数 base 范围从2 至36,或0。参数 base 代表 nptr 采用的进制方式,如 base 值为10 则采用 10 进制,若 base 值为16 则采用16 进制数等。
功能描述
convert a string to an unsigned long integer(把输入的字符串转换成数字).
strtoul() 会扫描参数nptr 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(‘\0’)结束转换,并将结果返回。注意
- 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 ‘0x’ / ‘0X’ 前置字符则会使用 16 进制转换,遇到 ‘0’ 前置字符则会使用 8 进制转换。
- 若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。
实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main ()
{
char buffer [256];
unsigned long ul;
char * endptr;
while(1)
{
printf ("Enter an unsigned number: ");
fgets (buffer, 256, stdin);
ul = strtoul (buffer, &endptr, 10);
printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);
system("pause");
}
return 0;
}
snprintf( )
c头文件 : <stdio.h>
声明:int snprintf(char *str, size_t size, const char *format, …);
参数及返回值
str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。
成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。
函数功能
写入字符串
实例
1
2
3
4
5
6
7
8
9
int main()
{
char str[5];
int ret = snprintf(str, 3, "%s", "abcdefg");
printf("%d\n",ret);
printf("%s",str);
return 0;
}
fork/exec
fork
调用fork可以创建一个新的进程称为子进程, 调用fork函数的进程称为父进程, 子进程的所有内容都和父进程相同, 除了pcb(进程控制模块)。如果这两个进程都没有对内存做写操作的话, 那么两个进程共享调用fork函数的进程的内存页, 这样表面上看fork创建进程比exec创建进程快. 但只要两个进程其中一个对内存做了修改, 那么在修改之前, 就会把内存页复制一份给子进程用(写时复制)
exec
调用exec创建进程, 实际上不是创建进程, 更准确的说是加载可执行文件, 调用exec后会把exec中指定的可执行文件加载到调用exec的进程的空间内, 并把调用exec的进程的内存更新为exec中指定的可执行文件的内容.