自动变量 函数中的每个局部变量只在函数被调用时存在,函数执行完毕时消失。 必须要为其赋值
外部变量
可以在全局范围内访问 程序执行期间一直存在
必须定义在所有函数之外,并且只能定义一次。
在每个需要访问外部变量的函数中,必须声明响应的外部变量,此时说明其类型(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;
}