Guo Qiang

常用代码示例 (C/C++ & Shell)

Common code examples
image
当你有兴趣去做一件事情,它将变得不再枯燥

这里将会记录一些实用性比较强的代码片段,主要以 c/c++ 语言和 shell 脚本为主,只要对我有帮助的代码,我都会尽可能的保留下来,这样也方便查询和学习。

awk 中使用 system 调用系统命令

awk 作为一个强大的文本分析工具,在脚本中可以发挥其巨大的灵活性,一次在写代码的时候,想要在 awk 中直接调用系统命令,本想使用一行完成,结果不行,似乎要分开来写,这种写法几乎和 C 语言一致:


cmd=sprintf("pkg info | grep %s", $1);
system(cmd);


查找匹配文件中包含指定字符串

find 命令不仅可以查找文件,还可以查找文件内容,这需要与 xargs 一起使用,这个也是一种非常常用的方法:


find . -name "*.php" | xargs grep -n mysql
find . \( -name "*.php" -or -name "*.html" \) | xargs grep -n mysql


正整数反转

递归在编程中使用非常广泛,它能使代码的逻辑变得清晰,且代码也很精简,只是一定要记住要有一个出口,否则就无限递归下去,直至系统崩溃。


void reverse(int n)
{
	if (!n) {
		printf("\n");
		return;
	}

	printf("%d", n % 10);
	reverse(n / 10);
}


汉诺塔问题

汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭,也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。


/* 这里代表将a柱子上的盘子借助b柱子移动到c柱子 */
void hanoi(int n, char a, char b, char c)
{
	/* 如果是一个盘子直接将a柱子上的盘子移动到c */
	if (n == 1)
		printf("%c-->%c\n", a, c);
	else
	{
		/* 将a柱子上n-1个盘子借助c柱子,移动到b柱子 */
		hanoi(n - 1, a, c, b);

		/* 再直接将a柱子上的最后一个盘子移动到c */
		printf("%c-->%c\n", a, c);

		/* 然后将b柱子上的n-1个盘子借助a移动到c */
		hanoi(n - 1, b, a, c);
	}
}


迷宫问题 JavaKarel

Java Karel 机器人的模拟迷宫算法,短小精悍,值得借鉴。


import stanford.karel.*;
public class MazeKarel extends SuperKarel {
	public void run() {
		while(noBeepersPresent()) {
			if(leftIsClear())
				turnLeft();
			else
				while(frontIsBlocked())
					turnRight();
			move();
		}

		pickBeeper();
	}
}


const char*, char const*, char* const的区别


/* ------------------------------
  一共3种写法:
  1、const char*
  2、char const*
  3、char* const

  第1种和第2种其实是一样的,只是写法不同而已,const 作用的是 char* ,
  也就是指针所指的内容为常量,但指针是可变的。

  第3种 const 作用的是指针,指针为常量,不可变,而指针所指的内容是可变的。
------------------------------ */

int main()
{
	char p[] = "point";
	char const *p1 = "abc";
	p1++;

	const char *p2 = "123";
	p2++;

	char *const p3 = p;
	p3[2] = 'I';

	printf("p1=%s\n", p1);
	printf("p2=%s\n", p2);
	printf("p3=%s\n", p3);

	return 0;
}