C语言中一些很酷的技巧(cool tricks)

来自Quora,觉得不错,就实践了一下。

1.  #if 0 ...... #endif 块中的内容不会被编译,因为注释不允许嵌套,我们可以把暂时不用的代码块放在

这里面。

2. 数组初始化的时候可以指定索引,而且可以给特定范围的数组赋值。

比如  int array[] = { [0 ... 9] = 1, [10 ... 20] = 2, [30 ... 40] = 3};

等价于    int array[] = { 1, 1, 1, 1, ..... 2, 2, 2 ...... 3, 3, 3};

示例:

#if 0

here will not enter into compile
we can move the code we not need now here

#endif

#include<stdio.h>

int  main(){
    int i = 0;
    int arr[] = {[1]=5, [5]=10, [2]=20};
    int arr2[] = {[0 ... 9] = 10, [10 ... 19] = 20, [20 ... 29] = 30};
    for(i = 0; i < 6; i++)
        printf("arr[%d] = %d ,", i, arr[i]);
    printf("\n");
    for(i = 0; i < 30; i++)
        printf("arr2[%d] = %d ,", i, arr2[i]);
    return 0;
}

3. 要巧妙使用scanf,支持正则式,而且可以超越每次读到空白就终止的限制。

示例:

#include<stdio.h>
#define MAX 100

int  main(){
    int i = 0;
    char s1[MAX],s2[MAX];

    //scanf("%[^\n]\n",s1);
    //read till meet '\n',and then trash the \n

    //scanf("%[^,]",s1); //?? also will  trash the coma
    //scanf("%[^,],",s1); // this does not trash the coma

    //this * can make us skip some input
    //for example,we just care the last-name
    scanf("%*s %s",s1);

    printf("%s\n",s1);

    return 0;
}

4. 理解offset宏定义,求一个成员在结构体中的偏移量。

示例:

#include <stdio.h>
#include <stdlib.h>

#define offset(TYPE, MEMBER) ((size_t)(&((TYPE *)0)->MEMBER))

int main(){
    struct test{
        int a;
        int b[4];
        int c;
    };  

    printf("offset a : %lu\n", offset(struct test, a));
    printf("offset b : %lu\n", offset(struct test, b));
    printf("offset c : %lu\n", offset(struct test, c));

    struct test *t = (struct test *)0;
    printf("%d\n", &(t->c));  // right
    printf("%d\n", t->c);  //?but cannot do this, core dump

    return 0;
}

5. s[i] 是 *(s + i) 的语法糖,所以等价于 i[s]。

示例:

#include <stdio.h>

int main(){
    char s[] = "vonzhou";
    printf("%c\n", 2[s]);   

    return 0;
}

6. 再次是printf 和 scanf 的技巧。

#include <stdio.h>

int main(){

    int n = 6;
    int val = 1000;
    char s[100];
    printf("%*d", n, val);// with a minimum width of n,default right aligned
    printf("hello\n");

    //scanf("%*d");//read an integer and ignore it

    //scanf has regex built into it
    //read only selected chars into a string
    //scanf("%[abcd]s", s);

    //read everything excepted heading with abcd
    //scanf("%[^abcd]s" ,s);

    /* some complain that scanf reads upto a whitespace,
    so this trick can be used to consume everything upto a newline */
    scanf("%[^\n]s", s);
    // reads all chars (including whitespaces) till newline is encountered.

    printf("s = %s\n", s);
    /* Another trick with scanf is to consume what is required.
    For example - If  a user enters his date of birth in YYYY-MM-DD
    then you can directly read the year month and date into integer variables */
    //scanf("%d-%d-%d", &yy, &mm, &dd);
    /* where yy, mm, dd are variables.
    Note that this will work only with that format of input.
    Anything else like YYYY/MM/DD,and the program will mostly crash.
    You specify a hyphen, it expects only a hyphen! */

    return 0;
}

7.利用scanf的返回值来识别是否到达文件尾EOF;当errno=0时%m格式会输出“Success”;brk(0)可以作为 return 0 的替代;

示例:

#include <stdio.h>

int main(){
    int n;
    //util reach EOF(ctrl + D)
    while(~scanf("%d",&n)){
        //logic process
        printf("%d^2 = %d\n", n, n*n);
    }   

    // %m print success only if errno = 0
    printf("%m\n");

    brk(0);
}

7.变量会被隐式初始化为0和1;

示例:

<pre name="code" class="cpp">#include <stdio.h>

// ??
// implicit initiliazation of variables with 0 and 1
g;main(i){

    printf("%d,%d\n", g, i); 

    return 0;
}

C语言中一些很酷的技巧(cool tricks)

时间: 2024-11-08 18:07:37

C语言中一些很酷的技巧(cool tricks)的相关文章

[转]C语言中自增自减运算符教学探究-中国论文网

摘要:C语言教学中,自增自减运算符运用得非常广泛,且具有一定的使用技巧和难度.在诸多运算符中,自增自减运算符是学生最难理解和最易出错的运算符.对自增自减运算符的功能和具体应用进行探究,以期为提高C语言教学效果提供帮助.中国论文网 http://www.xzbu.com/8/view-3865031.htm 关键词:C语言:自增自减运算符:教学效果 中图分类号:G434文献标识码:A文章编号:1672-7800(2012)012-0188-02 0引言 C语言编程设计中,若合理使用自增自减运算符,

C语言中的零长度数组使用说明

C语言中的零长度数组用法详解 在C语言中允许在结构体和联合体中定义零长度的数组,写法可以是以下两种: char p[]或者char p[0],这个数组定义在结构体或者联合体中,不占用空间大小. 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势: 1.不需要初始化,数组名直接就是所在的偏移: 2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间. "这个数组不占用任何内存",意味着这样的结构节省空间:"该数组的内存地址就和他后面的元素的地址

(zz)数据库设计中的14个技巧

1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实 体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计 录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会 关系表.工作简历表.这就是“一张原始单证对应多个实体”的典型例子. 2. 主键与外键

C语言中从大到小的顺序排列《学习记录》

一.前言 终于走到了指针,走到了翘首期盼的指针.指针是c语言中一个重要的概念,也是c语言最精彩的部分.正确而灵活的运用它,可以是程序简洁.紧凑.高效,每一个学习c语言的小伙伴都应该深入的学习和掌握指针. 本节目标 指针是什么 指针变量 通过指针引用数组 通过指针引用字符串 二.指针是什么 为了了解指针的概念,我们先来看一个小故事. 话说福尔摩斯派华生到威尔爵士居住的城堡去取回一个重要的数据.白天,在书房里,威尔爵士当着福尔摩斯和华生的面亲自将数据锁在了书柜中编号为3010的抽屉,用手电筒一照,只

数据库设计中的14个技巧

1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实 体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计 录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会 关系表.工作简历表.这就是“一张原始单证对应多个实体”的典型例子. 2. 主键与外键

JavaScript 语言中的 this

JavaScript 语言中的 this 由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用.下面我们将按照调用方式的不同,分别讨论 this 的含义. 作为对象方法调用 在 JavaScript 中,函数也是对象,因此函数可以作为一个对象的属性,此时该函数被称为该

日志处理中一些shell命令技巧

日志处理中一些shell命令技巧 阴差阳错的做的日志分析,前途未卜的这段日子,唯一还有点意思的可能就是手动的处理大量日志.总结一下. 日志文件的输入是动则几个G的文本.从N个这样的文件中得到一个列表,一个数字,一个比例.在什么工具都没有情况下,用shell命令不仅是验证系统数据的准确性的方法,也是一个很好的学习过程. 使用cut命令切割日志行 下面的一行典型的apache访问日志: 120.51.133.125 - - [26/Apr/2013:12:20:06 +0800] "GET /ski

Matlab中的一些小技巧

Matlab中的一些小技巧 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. 2. figure命令新建一个绘图窗口 figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口.当有多个figure窗口时,在命令窗口中执行如Plot等命令将覆盖当前figure窗口中的对象.所谓的当前figure窗口,也就是最后一次查看的窗口(可以用

C语言中一些乱七八糟的用法与细节(不断更新)

用C语言比较多,这篇是平时攒下的.有些内容在工作后可能会很常见,但是不用容易忘,所以就写篇博客吧. 一.printf的用法 %*可以用来跳过字符,可以用于未知缩进.像下面一样. for(i = 1; i < 10; i++) { printf("%*c\r%*c\n",  9 - abs(i - 5), '*', abs(i - 5) + 1, '*'); } %[]可以用来读取指定的内容,%[^]可以用来忽略指定内容(正则表达式?) %m可以不带参数,输出产生的错误信息 二.关