C语言学习笔记(四)

学习C语言第四天

1.5.2 字符计数

在linux中 文件结束符为Ctr+D

#include

/* 统计输入的字符数:版本1*/
main() {
    long nc;

    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

这里引入了一个新的运算符++,其功能是执行加1操作。可以用nc=nc+1代替它,但语句++nc更简练一些,且通常效率也更高。与改运算符相应的是自减运算符--。
该字符计数程序使用long类型的变量存放计数值,而没有使用int类型的变量。long整数型(长整型)至少要占用32位存储单元。在某些机器上int与long类型的长度相同,但在一些机器上,int类型的值可能只有16位存储单元的长度(最大值为32767),这样,相当小的输入都可能是int型的计数变量溢出。转换说明%ld告诉printf函数其对应的参数是long整型。
使用double(双精度浮点数)类型可以处理更大的数字。我们这里不适用while循环语句,而用for循环来展示编写此循环的另一种方法:

#include

/* 统计输入的字符数:版本2*/
main() {
    double nc;

    for(nc = 0; getchar() != EOF;  ++nc)
        ;
    printf("%.0f\n", nc);
}

对于float与double类型,printf函数都使用%f进行说明。%.0f强制不打印小数点和小数部分,因此小数部分的位数为0。
在该程序段中,for循环语句的循环体是空的,知识因为所有工作都在测试(条件)部分与增加步长部分完成了。但C语言的语法规则要求for循环语句必须有一个循环体,因此用单独的分号代替。单独的分号称为空语句,它正好能满足for语句的这以要求。把它单独放在一行是为了更加醒目。

1.5.3 行计数

接下来的这个程序用于统计输入中的行数。标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束。因此统计行数等价于统计换行符的个数。

#include

/* 统计输入中的行数 */
main() {
    int c, nl;

    nl = 0;
    while ((c = getchar()) != EOF)
        if(c == '\n')
            ++nl;
    printf("%d\n", nl);
}

双等于号==是C语言中表示“等于”关系的运算符,由于C语言将单等与号=作为赋值运算符,因此使用双等于号==表示相等的逻辑关系,以示区分。
单引号中的字符表示一个整型值,改值等于此字符在机器字符集中对应的数值,我们称之为字符常量。但是它只不过是小的整型数的另一种写法而已。例如,‘A’是一个字符常量;在ASCII字符集中其值是65。当然,用'A'要比用65号,因为'A'的意义更清楚,且与特定的字符集无关。
字符串常量中使用的转义字符序列也是合法的字符常量,比如,'\n'代表换行符的值,在ASCII字符集中其值为10。我们应当注意到,'\n'是单个字符,在表达式中它不过是一个整型数而已;而"\n"是一个仅包含一个字符的字符串常量。

练习1-8 编写一个统计空格、值表符与换行符个数的程序。
练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替
练习1-10 编写一个将输入复制到输出的程序,并将其中的值表符替换为\t,把回退符替换为\b,把反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来。

———————————————————————————————————————————
#include

/* 练习1-8统计空格、制表符与换行符个数 */
main() {
    int c, nspace, ntab, nn; // 输入字符,空格、制表符、换行符的计数变量
    
    nspace = 0;
    ntab = 0;
    nn = 0;

    while((c = getchar()) != EOF) {
        if (c == ' ') {
            nspace++;
        } else if ( c == '\t') {
            ntab++;
        } else if (c == '\n') {
            nn++;
        }
    }
    printf("输入框空格:%d个,值表符:%d个,换行符:%d个,总共%d个\n", nspace, ntab, nn, nspace+ntab+nn);
}

———————————————————————————————————————————

#include

/* 练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替 */
main() {
    int c, nspace; // 输入字符,空白字符个数

    nspace = 0;
    while((c = getchar()) != EOF) {
        if (c == ' ')  {
            nspace++; // 如果输入的一直是空白就一直
        } else if(nspace > 0) { // 如果输入的不是空格,并且前面输入空格,无论多少都输出一个空格,并输出当前字符。
            putchar(' ');
            putchar(c);
            nspace = 0;  // 输出后把空格数清零,否则每次输入不是空格的字符,前面都由各空格
        } else {
            putchar(c); // 既不是空格,前面也没有空格,就直接输出
        }

    }
}

———————————————————————————————————————————

#include
/* 练习1-10 编写一个将输入复制到输出的程序,并将其中的值表符替换为\t,把回退符替换为\b,把反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来。*/
main() {
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t') {
            putchar('\\');
            putchar('t');
        } else if (c == '\b') {  // \b由于有命令行有缓冲,打印不出来。
            putchar('\\');
            putchar('b');
        } else if (c == '\\') {
            putchar('\\');
            putchar('\\');
        } else {
            putchar(c);
        }
    }
}

你可能感兴趣的:(C语言,c语言)