TCPL第一章部分代码整理
最近重新拿起了TCPL,从头开始把整本书再看一遍,把其中的一些代码单独拿出来,整理了一下。
在TCPL中,开始第一章就用到了EOF,在Windwos中调试的时候,可以使用“^Z“来做文件输入结束的标志。文件结束符号EOF是在char类型之外的值,为了使getchar()能够返回EOF,需要把字符定义为int型。EOF的值是-1。
文件复制:
int c;
while ((c = getchar()) != EOF)
putchar(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 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;
}
}
#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'];
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;
}
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;
}
#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;
}