避免老年痴呆,每日一个小程序(二)

接上篇,今天的小程序:编写程序detab,将输入中的制表符替换成适当数目的空白符(使空白充满到下一制表符停止位)。假定制表符停止位的位置是固定的,比如在每个n列的位置上。n应为变量或符号参数吗?--为避免空格与tab显示难以区分,这里使用指定长度的‘*’号填充tab符号。

#include <stdio.h>
/*将输入的制表符替换为适当数量的‘*’ */
#define N 4  //制表符的停止位
#define MAXLENGTH 1000 //输入行最大长度
int getLine(char s[],int lim);
void convertTab(char s[]);
main(){
    char line[MAXLENGTH];
    int len = 0;
    while((len = getLine(line,MAXLENGTH)) > 0){
        convertTab(line);
        printf("%s",line);
    }
    return 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;
        ++i;
    }
    s[i] = '\0';
    return i;
}

void convertTab(char s[]){
    int i,j,k,c;
    int len;   //替换tab后的当前字符串长度
    char d[MAXLENGTH]; //用于存放替换后的字符串 
    for(i = 0,j = 0; (c = s[i]) != '\0';++i){
        if(c == '\t'){
            len = j;
            for(k = 0;k < (N - len % N);++k){
                d[j] = '*';
                ++j;
            }
        }
        else{
            d[j] = c;
            ++j;
        }
    }
    d[j] = '\0';
    
    for(i = 0; i <= j; ++i)
        s[i] = d[i];
    
    return;
}

 

posted @ 2014-12-06 12:39  cdskycom  阅读(164)  评论(0编辑  收藏  举报