01.由一个程序开始(一)

第一次听说这本书时,本以为只讲解指针,看了作者前言后才明白,原来也是系统学习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:指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息
------------------------------------------------------------------------------------------------>

你可能感兴趣的:(程序)