<一> 导言

  1. getchar()函数原型:int getchar(void)
  2. 一个简单的程序:
#include <stdio.h>

int main(void)
{
    int c;
    while ((c=getchar()) != EOF)
        putchar(c);
    return 0;
}

其中(c=getchar())表达式的值为c为了解决区分有效输入和文件结束符,C语言采用EOF(当没有输入时,getchar()将返回一个特殊值,这个特殊值就是EOF)Windows中 Ctrl+z结束,Linux中Ctrl+d结束上诉程序还需注意的是 !=的优先级大于=的优先级
3. 关于字节长度,2位机上long为4个字节,
打印long,printf(“%ld”) ,printf(“%.0f”,f),强制不打印小数点和小数部分(若想表示个更大范围的整数,可double i)
4. for 和 while 语句的优点之就是:在执行循环体一开始就对条件进行测试
5. 看一下Linux 中的wc程序的主干部分

#include <stdio.h>

#define IN 1 /* 在单词内*/
#define OUT 0 /* 在单词外*/

/*  统计输入的行数、单词数与字符数*/ 

int main(void)
{
    int c,nl,nw,nc,state;

    state = OUT;
    nl = nw = nc = 0;
    while ( (c=getchar()) != EOF)
    {
        ++nc;
        if (c == '\n')  
            ++nl;
        if (c==' ' || c=='\n' || c=='\t')
            state = OUT;
        else if (state == OUT)
        {
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n",nl,nw,nc);
    return 0;
}
  1. main也是函数,因此也有return,一般来说返回0表示正常终止,非0表示出现异常或出错结束的条件
  2. 字符数组,先看下面程序
#include <stdio.h>
#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* 打印输出最长行 */
int main(void)
{
    int len;
    int max;

    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ( (len=getline(line,MAXLINE)) > 0)
    {
        if (len > max)
        {
            max = len;
            copy(longest,line);
        }
    }
    if (max > 0)
        printf("%s",longest);

    return 0;
}

/*将一行读入到s中并返回其长度*/
int getline(char s[], int lim)
{
    int c,i;

    for (i=0; i<lim-1 && ( (c=getchar()) != EOF) && c!='\n'; ++i)
        s[i] = c;
    //保存'\n'的
    if (c == '\n')
    {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';

    return i;
}

void copy(char to[], char from[])
{
    int i;
    i = 0;

    while ( (to[i] = from[i]) != '\0') //将'\0'也给拷贝了
        ++i;
}
  • 注意:getline函数把’\0’插入到它创建的数组末尾,以标记字符串的结束。printf函数中的格式%s对应的参数必须是这种形式表示的字符串。copy函数的结束也是依赖于’\0’,它将’\0’也拷出到输出参数中去
  • 问题:当读入的行长度大于允许的最大值时,main函数应该如何处理?
  • 思路:首先getline函数是安全的,因为无论是否达到换行字符,当数组满时它将停止读字符,main函数可以通过测试行的长度以及检查返回最后一个字符来判断当前行是否太长,然后根据具体情况处理
    1. 外部变量:必须定义在所有函数之外(包括 main),且外部变量只能定义一次,定义后编译程序将为它分配存储单元。在每个需要访问外部变量的函数中,必须声明(extern)相应的外部变量,此时说明其类型这样所有的函数都可以通过变量名进行访问,因此函数间可以通过变量交换数据,而不必使用参数表。
#include <stdio.h>
#define MAXLINE 1000

int max;
char line[MAXLINE];
char longest[MAXLINE];

int getline(void);
void copy(void);

/* 打印输出最长行 */
int main(void)
{
    int len;
    extern int max;

    extern char longest[MAXLINE];

    max = 0;
    while ( (len=getline()) > 0)
    {
        if (len > max)
        {
            max = len;
            copy();
        }
    }
    if (max > 0)
        printf("%s",longest);

    return 0;
}

/*将一行读入到s中并返回其长度*/
int getline(void)
{
    int c,i;
    extern char line[];

    for (i=0; i<MAXLINE-1 && ( (c=getchar()) != EOF) && c!='\n'; ++i)
        line[i] = c;
    if (c == '\n')
    {
        line[i] = c;
        ++i;
    }
    line[i] = '\0';

    return i;
}

void copy(void)
{
    int i;
    extern char line[],longest[];
    i = 0;

    while ( (longest[i] = line[i]) != '\0')
        ++i;
}
  • 由于是外部变量,程序在使用外部变量之前,必须知道外部变量的名字,使用extern声明;某些情况下可以省略extern声明,在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没必要使用extern声明,因此上述几个extern都是多余的通常的作法是,所有外部变量的定义都放在源文件的开始处,这样就可以省略extern声明
  • 如果程序有多个源文件,某个变量在file1中定义,在file2和file3中使用,则在file2和file3中就需要使用extern声明来建立该变量与定义之间的联系。习惯把变量和函数的extern声明放在一个单独的文件中 (头文件),并在开头include
  • 定义和声明:“定义”表示创建变量或分配存储单元;“声明”指的是说明变量的性质,并不分配单元

你可能感兴趣的:(<一> 导言)