【C语言】常见问题和通用技巧

引用另一文件全局变量

在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:覆盖赋值

扫描二维码关注公众号,回复: 13280671 查看本文章
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]);

猜你喜欢

转载自blog.csdn.net/u010637291/article/details/107686726