第一章
这一章主要是记录几个实用的程序。也许其中有些程序并不能用在实际的项目中,但是作为学习参考,其价值还是很大的
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++ ] ) ) ;
}
从这两个函数中,我看到了我写的函数和专家写的函数的区别:
我写的函数只是在语法上是函数,至于算法、效率这些东西,那一般是不考虑的。能写出函数就不错了
而专家的函数,不仅仅是实现功能,同时算法之高效也不是我能比的。能一次遍历解决的,从来不会多遍历一个元素。能用一个变量完成的事,从不会多声明一个变量。
当然现在我可以不考虑算法的效率,因为现在的计算机已经不是几十年前的计算机了。但是作为一名程序员,精确的说,作为一各编码员,应当时刻保持代码的高效、简单