K & R C 笔记

第一章

这一章主要是记录几个实用的程序。也许其中有些程序并不能用在实际的项目中,但是作为学习参考,其价值还是很大的

HelloWorld

这个程序应该是每个学习编程的人写的第一个程序,可能输出并不是伟大的HelloWorld,比如是:This is a C program! 我写的第一个C程序也是这样的。现在这个程序对我的意义就是测试开发环境有没有正确配置。


#include<stdio.h>
int main( void ){
	printf( "\nHello World!\n来自小代码!\n" );
	return 0;
}

字符回显程序


这是我在K&R C上学到的第一个实用程序,包括后面的单词计数也是极实用的程序。每次我给新手写判断输入的字母个数或数字个数这种程序时,我都会把这个程序拿出来。实际上直到现在写一些字符处理的程序时,依然要用到这个程序。

#include<stdio.h>
int main( void ){
	char c = 0;
	const char MYEOF = '#';
	//原来的判断条件
	//	while(  EOF != ( c = getchar(  ) ) ){
	while(  MYEOF != ( c = getchar(  ) ) ){
		putchar( c );
	}
	return 0;
}


单词计数:


#include<stdio.h>

#define IN 1
#define OUT 0

int main( void ){
	int words = 0;
	char c = '\0';
	char MYEOF = '#';
	int state = OUT;

	while(  MYEOF != ( c = getchar(  ) ) ){
		if(  ' ' == c || '\n' == c  ){
			state = OUT;
		}else if( OUT == state  ){
			state = IN;
			++words;
		}
		
	}

	printf( "words = %d\n",words );
	return 0;
}


getline和字符串复制函数的实现


这两个程序让我看到了怎样利用指针和数组的关系处理字符串,我自己对比着写了一个计算字符串长度的函数


#include<stdio.h>

//最大的行长度
#define MAXLINE 1000

int mygetline( char line[], int maxline );

void mystrcpy( char to[ ], char from[ ] );

int mystrlen( char str[  ] );

int main( void ){
	char str[ MAXLINE ];
	mygetline( str,MAXLINE );
	char str2[ MAXLINE ];
	mystrcpy( str2,str );
	puts( str );
	puts( str2 );
	int len = mystrlen(str);
	printf("len = %d\n",len);

	return 0;
}

int mygetline( char line[], int maxline ){
	char c = '\0';
	int i = 0;

	for(  i = 0; i < maxline - 1 && EOF != ( c = getchar(  ) ) && '\n' != c; ++i ){
		line[ i ] = c;
	}

	/*
	  原文中将回车符加入了字符数组中,但是在程序中我一般用不到,所以我把这部分给注释了

	if(  '\n' == c  ){
		line[ i ] = c;
		++i;
	}
	*/
	line[ i ] = '\0';

	return i;
}

void mystrcpy( char to[ ], char from[ ] ){
	int i = 0;
	while( '\0' != ( to[ i ] = from[ i ] ) ){
		++i;
	}
		
}

int mystrlen( char str[  ] ){
	int i = -1;
	while( '\0' != str[++i]) ;
	return i;
}


第二章

枚举的简单使用

目前在C语言中我不常用或者说是不会用的语法有三部分:枚举、go语句、预处理。go语句是不想用,enum是之前写的代码的规模还没到需要使用枚举的程度,而预处理则是这三部分中最为复杂的。从今天开始就要学会使用枚举了


#include<stdio.h>
int main( void ){
	enum _SEX {
		SEX_MALE,
		SEX_FEMALE
	};
	enum _SEX sex;
	sex = SEX_MALE;

	switch( sex  ){

	case SEX_MALE:{
		puts( "男性!" );
		break;
	}
	case SEX_FEMALE:{
		puts( "女性!" );
		break;
	}
	}

	return 0;
	return 0;
}




几个函数的实现

1、atoi


int my_atoi(  char str[  ] ){
	int i = 0;
	int n = 0;

	for(  i = 0; str[ i ] >= '0' && str[ i ] <= '9'; ++i ){
		n = 10 * n + (  str[ i ] - '0' );
	}
	return n;
}
当然这个函数实现起来并不困难,难的是将代码写的如此优雅、简洁。要知道书上的代码都是那种没有大括号的风格,而我的代码风格则是加上所有的大括号,由此可见书上的代码简洁之极。


2、删除字符串中某一字符、字符串链接

如果atoi这个函数只是看起来比较简洁的话,那么下面的两个函数就是真正的简单了


//删除字符串s中所有的字符c
void squeeze(  char str[ ], int c ){
	int i = 0;
	int j = 0;

	for(  i = j = 0; str[ j ] != '\0'; i++ )
		if(  c != str[ i ] )
			str[ j++ ] = str[ i ];

	str[ j ] = '\0';
}

//将字符串t连接到字符串s之后,假如s足够长
void strcat(  char s[  ], char t[  ] ){
	int i = 0;
	int j = 0;

	//判断是否为字符串s的尾部
	while(  '\0' != s[ i ] )
		i++;

	//复制
	while(  '\0' != ( s[ i++ ] = t[ j++ ] ) ) ;
}
从这两个函数中,我看到了我写的函数和专家写的函数的区别:
我写的函数只是在语法上是函数,至于算法、效率这些东西,那一般是不考虑的。能写出函数就不错了
而专家的函数,不仅仅是实现功能,同时算法之高效也不是我能比的。能一次遍历解决的,从来不会多遍历一个元素。能用一个变量完成的事,从不会多声明一个变量。


当然现在我可以不考虑算法的效率,因为现在的计算机已经不是几十年前的计算机了。但是作为一名程序员,精确的说,作为一各编码员,应当时刻保持代码的高效、简单






转载于:https://my.oschina.net/iamhere/blog/532752

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值