C程序设计语言 chapter1 1.10 变量和作用域

自动变量  函数中的每个局部变量只在函数被调用时存在,函数执行完毕时消失。 必须要为其赋值


外部变量  

可以在全局范围内访问 程序执行期间一直存在

必须定义在所有函数之外,并且只能定义一次。

在每个需要访问外部变量的函数中,必须声明响应的外部变量,此时说明其类型(extern)


过分依赖外部变量会导致一定的风险,因为它会使程序中的数据关系模糊不清——外部变量会意外地或不经意地修改,而程序的修改变得非常困难。

函数将他们操纵的变量名直接写入函数,会使函数失去通用性。


练习1-20 编写程序detab,将输入中的制表符替换成适当数目的空格,是空格充满到下一个制表符终止位的地方。

一开始没有理解题目的意思。

例如: 输入 12\t345\t78

则输出应为 12      345     78

即 12之间应该有6个空格   345与78之间应该有5个空格

/*1-20 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方*/
#include <stdio.h>

#define		TABINC		8	//定义每个TABINC(8)个位置会出现一个制表位

int main(){
	int c;
	int nb=0;
	int pos=1;
	while ((c=getchar())!=EOF)
	{
		if(c=='\t'){
			nb=TABINC-(pos-1)%TABINC;
			while (nb>0)
			{
				putchar(' ');
				nb--;
				pos++;
			}

		}
		else if(c=='\n'){
			putchar(c);
			pos=1;
		}
		else {
			putchar(c);
			pos++;
		}
	}
}

练习1-21  编写程序entab,将空格串替换为最少数量的制表符和空格

/*1-21 编写程序entab,将空格串替换为最少数量的制表符和空格*/
#include <stdio.h>

#define TABINC 8           //tab increment size
/*
    思路: 先判断输入的字符类型
    如果是空格 就++运算 统计空格的数量
    如果是换行,就把所有的统计数据清空
    否则就进行替换运算,先根据制表符的公式求出第一个制表符需要的空格数,
        如果空格总是大于制表符的位数,就循环减去制表符的位数,
        如果空格小于制表符的位数,就循环输出空格
*/

//replace strings of blanks with tabs and blanks
int main(void)
{
    int c;
    int nbspLength = 0;            /* 空格的长度 */
    int charLength = 0;            /* 字符串的长度 */
    int tabLength = 0;            /* 如果出现字符少于8位制表符的位数 */

      
	while((c=getchar())!=EOF){
		//是回车  清空统计数据
		if(c=='\n'){
			nbspLength=0;
			charLength=0;
		}
		//是空格 统计空格数量
		if(c==' '){
			nbspLength++;
		}
		//如果存在空格
		else if(nbspLength>0){
			tabLength=(TABINC-charLength)%TABINC;
			//可以用tab代替
			if(tabLength>0& Length>=tabLength){
				putchar('\t');
				nbspLength-=tabLength; //因为用tab代替了,所以减去tab的长度数量的空格数量
			}
			//代替了之后存在的空格数量大于TABINC,可以继续用tab代替
			if(nbspLength>TABINC){
				while (nbspLength>TABINC)
				{
					putchar('\t');
					nbspLength-=TABINC;
				}
				charLength=nbspLength;//关键!
				while (nbspLength>0){
					putchar(' ');
					nbspLength--;
				}
				
			}
			else{
				charLength=nbspLength;
				while (nbspLength>0)
				{
					putchar(' ');
					nbspLength--;
				}
			}
		
		}
		putchar(c);
		charLength++;
		nbspLength=0;
	}
    
    return 0;
}

练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后

/*练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后*/
#include <stdio.h>
#define CHANGE 10
#define IN 1
#define OUT 0

int main(){
	int c;
	int count=0;
	int state=OUT;
	while ((c=getchar())!=EOF)
	{		
		if(count>=CHANGE){
			putchar(c);
			continue;
		}
		count++;
		if(c==' '||c=='\n'){
			if(state==IN)
				state=OUT;
		}
		else
		{
			if(state==OUT){
				state=IN;
				if(count>1)  putchar('\n');
				putchar(c);
			}
			else{
				putchar(c);
			}
		}
	}
}


练习1-23

//练习1-23:编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套。
#include <stdio.h>

#define MAXLINE 1000
#define IN 1
#define OUT 0

int getLine(char line[], int maxline);

int main(){
	char line[MAXLINE];
	int length;
	int i;
	int quote=OUT;
	int comment=OUT;
	while((length=getLine(line,MAXLINE))>0){
		for(i=0;i<length;i++){
			if(line[i]=='"')
				quote=IN;
			if(quote==OUT){
				if(line[i]=='/'&&line[i+1]=='*'){
					comment=IN;
					i++;
				}
				if(line[i-1]=='*'&&line[i]=='/'){
					comment=OUT;
					i++;
				}
				if(comment==OUT){
					putchar(line[i]);
				}
			}
			if(quote==IN)
			{
				putchar(line[i]);
			}
		}
	}
}


int getLine(char line[],int lim)//读取一行文本
{
	int c,i;
	for (i=0; i<lim-1 && (c = getchar()) !=EOF && c !='\n'; i++)
	{
		line[i] = c;
	}
	if (c == '\n')
	{
		line[i] = c;
		i++;
	}
	line[i] = '\0';
	return i;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值