第一次听说这本书时,本以为只讲解指针,看了作者前言后才明白,原来也是系统学习C的书籍,只不过全书都贯穿
了指针而已
基础的重要性:
什么事基础?就是要把我们大学所学的离散数学,算法与数据结构,操作系统,计算机体系结构,编译原理等课
程学好,对计算机的体系,CPU本身,操作系统内核,系统平台,面向对象编程,程序的性能等要有深层次的掌握.
对基础的学习就是内功,只注重招式而内功不扎实是不可能成为高手的.
编程就好比盖高楼,根基没打好早晚有一天会垮掉,而且盖得越高,损失也越惨重。
1.1简介
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_COLS 20
#define MAX_INPUT 1000
int readColumnNumbers(int columns[],int max);
void rearrange(char *output,char const *input,int nColumns,int const columns[]);
int main()
{
int nColumns;
int columns[MAX_COLS];
char input[MAX_COLS];
char output[MAX_INPUT];
nColumns = readColumnNumbers(columns,MAX_COLS);
while( gets ( input ) != NULL )
{
printf("Original input : %s\n",input);
rearrange(output,input,nColumns,columns);
printf("Rearrange line: %s\n",output);
}
return EXIT_SUCCESS;
}
int readColumnNumbers(int columns[],int max)
{
int num = 0;
int ch;
while(num<max && scanf("%d",&columns[num])==1 && columns[num] >= 0)
{
num += 1;
}
if(num % 2 != 0)
{
puts("Last column number is not paired.\n");
exit(EXIT_FAILURE);
}
while( (ch=getchar()) != EOF && ch != '\n' );
return num;
}
void rearrange(char *output,char const *input,int nColumns,int const columns[])
{
int col;
int outputCol;
int len;
len = strlen(input);
outputCol = 0;
for(col=0;col<nColumns;col+=2)
{
int nchars = columns[col+1] - columns[col]+1;
if(columns[col] >= len || outputCol == MAX_INPUT - 1)
{
break;
}
if(outputCol+nchars > MAX_INPUT - 1)
{
nchars = MAX_INPUT - outputCol - 1;
}
strncpy(output + outputCol,input + columns[col],nchars);
outputCol += nchars;
}
output[outputCol] = '\0';
}
空白和注释
程序员要有自己的风格,最好是使代码清晰易懂。学会在必要出加上注释
在C语言中我们经常通过注释掉一段代码而使它不起作用,这并不是一个好方法,如果你试图在一段代码首尾分别
加上/*和*/符号来“注释掉”这段代码,你不一定能如愿,如果这段代码内部原先就有注释存在,这样做就会出问题
例如:
#include <stdio.h>
int main()
{
printf("111111111111\n");
/*
printf("222222222222\n");
/*
printf("333333333333\n");
*/
printf("4444444444444\n");
*/
return 0;
}
这样注释时,实际注释掉的只有2、3,而4不能注释掉。由于最后一个"*/"是多余的,所有会编译出错.
(经验证,在Redhat,VC6.0,FREEBSD均是如此,当把最后一个"*/"注释掉后即可编译通过且正常运行)
要从逻辑上删除一段C代码,更好的方法是使用#if指令,如下:
#if 0
statements
#endif
在#if和#endif之间的程序段就可以有效的从程序中去除,即使这段代码之间原先存在注释也无妨,所以这是一种更
为安全的方法。(预处理指令的作用非常强大,将在14章详细讨论)
<----------------------关于条件编译-------------------------------------------------------
条件编译简单说就是当某条件满足时才编译某段代码.
形式: #if NNN
statement1;
#elif MMM
statement2;
#else
statement3
#endif
指令: #if 表达式
语句段1
#else
语句段2
#endif
#if 表达式1
语句段1
#elif 表达式2
语句段2
#else
语句段3
#endif
#ifdef 宏名
语句段
#endif
#ifndef 宏名
语句段
#endif (#else可以用于#ifdef和#ifndef中,但#elif不可以)
#error:指令将使编译器显示一条错误信息,然后停止编译
#line: 指令可以改变编译器用来指出警告和错误信息的文件和行号
#pragma:指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息
------------------------------------------------------------------------------------------------>