再来过

TCPL第一章部分代码整理

  最近重新拿起了TCPL,从头开始把整本书再看一遍,把其中的一些代码单独拿出来,整理了一下。

  在TCPL中,开始第一章就用到了EOF,在Windwos中调试的时候,可以使用“^Z“来做文件输入结束的标志。文件结束符号EOF是在char类型之外的值,为了使getchar()能够返回EOF,需要把字符定义为int型。EOF的值是-1。

文件复制:

int c;

while ((c = getchar()) != EOF)
    putchar(c);  

合并空格:

代码
#define IN  1
#define OUT 0

int state = OUT;

while ((c = getchar()) != EOF){
    
if (c == ' ')
        
if (state = OUT){
            state 
= IN;
            putchar(c);
        }
    
else{
        state 
= OUT;
        putchar(c);
    }
}

统计字符数、行数、单词数:

代码
#define IN  1
#define OUT 0

state = OUT;
while ((c = getchar()) != EOF)
    
++nc;
    
if (c == '\n')
        
++nl;
    
if (c == ' ' || c == '\t' || c == '\n')
        state = OUT;
    
else if (state == OUT){
        state = IN;
        
++nw;
    }
}

用数组来保存各数字出现的次数: 

while ((c = getchar()) != EOF)
    
if( c >= '0' && c <= '9')
        
++ndigit[c-'0'];

读入文本行,并返回其长度(0不是有效行长度,作为文件结束的返回值):

代码
int getline(char s[], int lim){
    
int c, i;

    
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'++i)
        s[i] 
= c;
    
if (c == '\n')
        s[i
++= c;
    s[i] 
= '\0';        //'\0'放到字符数组结尾,以标记字符串结束。
    return i;
}

 长的输入行拆分成短的,也就是最后习题1-22,我自己写的:

代码
#include <stdio.h>

#define N 20
#define MAXLEN 1000

int split(char s[], int lim);

int main(){
    
int i, len;
    
char line[MAXLEN];
    
    
while ((len = split(line, MAXLEN)) > 0){
        
for (i = 0; i < len; ++i)
        {
            printf(
"%c", line[i]);
        }
    }

    
return 0;
}

int split(char s[], int lim){
    
int c, i, j, count;

    
for (i = 0, count = 1; i < lim-1 && (c = getchar()) != EOF && c != '\n'++i, ++count){
        
if (i == 0 || count != N)
            s[i] 
= c;
        
else{
            
if (c == ' ' && c == '\t'){
                
++i;
                j 
= i;
                
while (s[j-1== ' ' || s[j-1== '\t'){
                    s[j] 
= s[j-1];
                    
--j;
                }
                s[j] 
= '\n';
                count 
+= (i - j);
            }
            
else{
                s[i] 
= c;
                s[
++i] = '\n';
            }
            count 
= 0;
        }
    }
    
if (c == '\n')
        s[i
++= '\n';

    
return i;
}


posted on 2010-01-18 14:38  再来过  阅读(253)  评论(0编辑  收藏  举报

导航