文章目录
引用另一文件全局变量
在a.c 文件中,已定义全局变量char *optarg;
则当bc想引用该变量时,在b中声明: extern char *optarg;
用宏来控制程序
如定义一个宏,来控制程序执行分支:
#define debug
// in main() or functions
#ifdef debug
// code ...
#else
//code ...
#endif
或者根据宏的值:
#define debug 1
//
// in main or functions
#if debug == 1
// code ...
#else
// code ...
#endif
更简单的方法为:
#if 1
// code ...
#else
// code ...
#endif
对于一些已定义的宏(如从其它文件引入的宏),还可解除该宏定义(实现代码的控制):
#ifdef debug
#undef debug
#endif
常见字符串操作
1. 获取长度: strlen
strlen
char *line = "testing string";
int len = strlen(line);
2. 字符串搜索 strrchr
C 库函数 char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
char *sourcestr = "a \testing* string";
char *ptr1 = NULL, char *ptr2 = NULL;
ptr1 = strrchr(sourcestr, '\\');
ptr2 = strrchr(sourcestr, '/');
这里给一示例引用:在文件路径+文件名的字符串中查找文件名,即最后一个/后的内容:
char * _basename(char *filename)
{
char *ptr1 = NULL, *ptr2 = NULL;
ptr1 = strrchr(filename, '\\');
ptr2 = strrchr(filename, '/');
if (ptr1 != NULL && ptr2 != NULL) {
return ptr1 > ptr2 ? ptr1+1 : ptr2+1;
}
else if (ptr1 != NULL) {
return ptr1 + 1;
}
else if (ptr2 != NULL) {
return ptr2 + 1;
}
else
return filename;
}
3. 字符串赋值strcpy/sprintf
strcpy:覆盖赋值
char suffix[256];
strcpy(suffix, ".end");
sprintf:追加赋值
C 库函数 int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。
char str[80];
sprintf(str, "r = %d, P = %f", r, M_PI);
puts(str);
4. 字符串追加 strcat
strcat:
// 接strcpy后
strcat(suffix, ".txt");
5. 字符串拆分 strtok
C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符
6. 字符串数组清空 memset
char bindir[1024];
strcpy(bindir, "ttt");
memset(bindir, 0, strlen(bindir));
#
memset(bindir, 0, sizeof(bindir));
7. 字符串取前n个字符 strncpy
char bindir_tmp[1024];
strcpy(bindir_tmp, "basename--basename");
int diff = 3;
strncpy(bindir_tmp, basename, diff);
## bindir_tmp: "bas"
strncpy()用来复制字符串的前n个字符,其原型为:
char * strncpy(char *dest, const char *src, size_t n);
【参数说明】dest 为目标字符串指针,src 为源字符串指针。strncpy()会将字符串src前n个字符拷贝到字符串dest。
不像strcpy(),strncpy()不会向dest追加结束标记’\0’.
常见文件操作
1. 打开文件 fopen
FILE *fopen(char *filename, char *mode):按照文件路径+名字打开文件,打开模式可为只读‘r’,二进制读取‘b’,并返回一个文件指针。
FILE * _open_lfile(char *lfile)
{
FILE *fp = NULL;
fp = fopen(lfile, "rt");
if (fp == NULL) {
fprintf(stderr, "Failed to open lfile: %s\n", lfile);
return NULL;
}
return fp;
}
2. 按行读取 fgets
C 库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
char * _getline(char *line, int n, FILE *fp)
{
char c;
int i, len;
if (line != NULL) line[0] = 0;
if (fp == NULL) {
return NULL;
}
if (fgets(line, n, fp) == NULL) {
return NULL;
}
/* Trim the tailing white-space character (0x09 ¨C 0x0D or 0x20). */
len = strlen(line);
for (i = len - 1; i >= 0; i--) {
if (isspace(line[i]))
line[i] = 0;
else
break;
}
return line;
}
创建文件夹
https://blog.csdn.net/u012005313/article/details/50688257/
数组大小 sizeof
int ssoffsets[512];
int max_offsets = sizeof(ssoffsets) / sizeof(ssoffsets[0]);