代码改变世界

Getting started with the basics of programming exercises_3

2015-04-29 17:16  星星之火✨🔥  阅读(156)  评论(0)    收藏  举报

1、编写一个程序删除每个输入行末尾的空格及制表符并删除完全是空白符的行

#include<stdio.h>
#define MAXLINE 1000 // maximum input line size
int getline(char line[], int maxline);
int delete(char s[]);
// remove trailing blanks and tabs, and delete blank lines
int main(void)
{
	char line[MAXLINE]; // current input line
	
	while(getline(line, MAXLINE) > 0)
		if(delete(line) > 0)
			printf("%s", line);
			
    return 0;
}

// getline: read a line into s, return length
int getline(char s[], int lim)
{
	int c, i, j; // i记录字符串的长度,j记录被复制到字符串中的字符的个数
	
	j = 0;
	for(i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
		if(i < lim-2)
		{
			s[j] = c; // line still in boundaries
			++j;
		}
	if(c == '\n')
	{
		s[j] = c;
		++j;
		++i;
	}
	s[j] = '\0';
	return i;
}
// remove trailing blanks and tabs from character string s
int delete(char s[])
{
	int i;
	
	i = 0;
	while(s[i] != '\n') // find newline character
		++i;
	--i; // back off from '\n'
	while(i > 0 && (s[i] == ' ' || s[i] == '\t'))
		--i;
	if(i >= 0) // is it a nonblank line?
	{
		++i;
		s[i] = '\n'; // put newline character back
		++i;
		s[i] = '\0'; // terminate the string
	}	
	return i;
}

2、编写一个翻转字符串顺序的函数,使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序

#include<stdio.h>
#define MAXLINE 1000 // maximum input line size
int getline(char line[], int maxline);
void reverse(char s[]);
// reverse input lines, a line at a time
int main(void)
{
	char line[MAXLINE]; // current input line
	
	while(getline(line, MAXLINE) > 0)
	{
		reverse(line);
		printf("%s", line);
	}
	return 0;
}
// getline: read a line into s, return length
int getline(char s[], int lim)
{
	int c, i, j; // i记录字符串长度,j记录被复制到字符串s中的字符的个数
	
	j = 0;
	for(i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
	{
		if(i < lim-2)
		{
			s[j] = c; // line still in boundaries
			++j;
		}
	}
	if(c == '\n')
	{
		s[j] = c;
		++j;
		++i;
	}
	s[j] = '\0';
	return i;
}
// reverse: reverse string s
void reverse(char s[])
{
	int i, j;
	char temp;
	
	i = 0;
	while(s[i] != '\0') // find the end of string s
		++i;
	--i; // back off from '\0'
	if(s[i] == '\n')
		--i; // leave newline in place
	j = 0;
	while(j < i) // beginning of new strings
	{
		temp = s[j];
		s[j] = s[i]; // swap the characters
		s[i] = temp;
		--i;
		++j;
	}
}

3、编写程序,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止的地方,假设制表符终止的位置是固定的,比如每隔n 列就会出现一个制表符终止位,n 应作为变量还是符号常量呢?

#include<stdio.h>
#define TABINC 8 // tab increment size
// replace tabs with the proper number of blanks
int main(void)
{
	int c, nb, pos;
	
	nb = 0; // number of blanks necessary
	pos = 1; // position of character in line
	while((c = getchar()) != EOF)
	{
		if(c == '\t') // tab character
		{
			nb = TABINC - (pos-1) % TABINC;
			while(nb > 0)
			{
				putchar(' ');
				++pos;
				--nb;
			}
		}
		else if(c == '\n') // newline character
		{
			putchar(c);
			pos = 1;
		}
		else
		{
			putchar(c); // all other characters
			++pos;
		}
	}
	
	
    return 0;
}