编辑器 + 编译器 + 调试工具 + 项目管理软件。
* 字符串操作, 包括字符测试,字符串拷贝,比较,查找,连接与分割等。
* 数据转换,包括字母大小写转换,字符串转换与整数,浮点数之间的转换。
* 内存分配与释放。
* 时间和日期,包括时间和日期的获取,显示以及时间的计算等。
* 其他应用,包括命令行参数的分析,用户和用户组操作以及环境变量操作。
9.1 字符串操作 『
9.1.1 字符测试
#include <ctype.h>
int isalpha(int c) 测试字符是否为英文字母
int isdigit(int c) 测试字符是否为数字
9.1.2 字符串初始化
#include <string.h>
void *memset(void *buffer, int c, int count); 将buffer所指向内存区域的前count字节设为字符c。
9.1.3 字符串的复制
(1), char *strcpy(char *dest, char *src);
(2), char *strdup(char *s);
(3), void *memcpy(void *dest, const void *src, size_t n);
功能是将参数 src 所指向的内存区域复制 count 字节到参数 dest 所指向的内存区域中,参数 src 和 dest 所指向的内存区域不可以重叠,函数返回指向 dest 的指针。而 strcpy 函数一旦遇到字符串结束符立即停止。memcpy 则不是,它不检查复制的具体内容。
(4), void *memmove(void *dest, const void *src, size_t count);
功能是将参数 src 所指向的内存区域复制 count 字节到参数 dest 所指向的内存区域中,返回指向dest的指针。但是它与 memcpy 的主要差别在于参数src 和 dest 所指向的内存区域可以重叠。
9.1.4 字符串比较
(1), int strcmp(const char *s1, const char *s2);
(2), int strncmp(const char *s1, const char *s2, size_t n);
(3), int strcasecmp(const char *s1, const char *s2);
(4), int strncasecmp(const char *s1, const char *s2, size_t n);
(5), int memcmp(const void *s1, const void *s2, size_t n);
功能是比较参数 s1 和 s2 所指向内存区域的前 count 个字节,不管里面有没有字符串结束符。
9.1.5 字符/字符串查找
(1) char *index(const char *s, int c);
char *rindex(const char *s, int c);
(2) strchr / strrchr
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
index(s, '\0'); rindex(s, '\0'); 对于 strchr / strrchr 是不可以的。
(3) char *strstr(const char *haystack, const char *needle);
9.1.6 字符串的连接与分割
(1), char *strcat(char *dest, const char *src); 注意 : 必须确保 dest 指向的缓冲区足够大。
char *strncat(char *dest, const char *src, size_t n); src前n个字符没结束符,则接后自己加
(2), char *strtok(char *str, const char *delim);
可以指定一个或多个分隔符。如果在字符串中找到任何一个分隔符,则将其更改为字符串结束符。
第一次调用该函数时,参数str必须设为要分割的字符串,以后调用时设为NULL。
strtok 函数每次调用成功后,返回下一个分割的字符串指针,如果已无从分割则返回NULL。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main() {
char str[] = "Linux C Programming";
char *p;
p = strtok(str, " ");
while(p != NULL) {
printf("%s\n", p);
p = strtok(NULL, " ");
}
printf("str : %s\n", str);
return 0;
}
-9.2 数据转换 『英文字母大小写转换,字符串与整数,浮点数之间』
#include <ctype.h>
int toupper(int c);
int tolower(int c);
#include <stdlib.h>
int atoi(const char *nptr);
long atol(const char *nptr);
对字符串进行扫描,直到出现数字或正负号才开始转换,之后出现非数字或字符串结束符即结束转换,只10进制。
double atof(const char *nptr);
double strtod(const char *nptr, char **endptr);
- char *gcvt(double number, size_t ndigits, char *buf);
-9.3 内存分配与释放
内存分配与释放的函数有 alloca, malloc, calloc, realloc, 以及 free 函数。
#include <stdlib.h>
void *alloca(unsigned size);
void *malloc(unsigned size);
void *calloc(size_t nmemb, size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);
-9.4 时间和日期
1, time 函数
#include <time.h>
time_t time(time_t *t);
2, gettimeofday 函数
#include <unistd.h>
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
9.4.2 时间和日期的显示
ctime, gmtime, asctime 函数用来将时间和日期转换为字符串格式。
时间的计算 double difftime(time_t time1, time_t time0);
-9.5 其他应用
其他应用包括 : 命令行参数分析,用户,用户组操作以及环境变量设置等。
9.5.1 命令行参数分析
int main(int argc, char **argv) 或 int main(int argc, char *argv[])
文件名本身作为第一个参数,其后的参数依次赋给 agrc.
#include <unistd.h>
int getopt(int argc, char *const argv[], const char *optstring); optstring为选项字符串。
optarg, optind, optopt;
9.5.2 用户和用户组操作
相关的函数 :getuid, getgid, getlogin, getpwent, getpwnam, getutent等。
1, #include <unistd.h>
#include <sys/types.h>
uid_t getuid(void); 获取当前用户标识符。
2, gid_t getgid(void);
3, char *getlogin(void) 获取当前用户的帐号名称。
4, #include <pwd.h>
#include <sys/types.h>
struct passwd *getpwent(void); 可以读取 /etc/passwd 所有用户账户信息。 endpwent.
5, #include <pwd.h>
#include <sys/types.h>
struct passwd getpwnam(const char* name);
6, #include <utmp.h>
/var/run/utmp 记录着当前登陆用户的信息,可以用该函数读取。
struct utmp *getutent(void); endutent.
9.5.3 环境变量操作
环境变量是包含系统环境信息的字符串,可以作用于用户的整个工作空间。 getenv, putenv, setenv;
获取更改增加环境变量。
1, #include <stdlib.h>
char *getenv(const char *name); 例如 :char *p = getenv("SHELL");
2, putenv 函数用于更改或增加环境变量
int putenv(const char *string);
3, int setenv(const char *name, const char *value, int overwrite);
参数 overwrite 用来设定是否替换已存在环境变量的内容。