第一章 一个入门实例 1.5 字符输入与输出

1.5 字符输入与输出

       下面我们将分析一系列用于处理字符数据的相关程序,你会看到许多程序都仅仅是我们在这里讨论的函数原型的扩展版本。

       标准库所支持的输入与输出的模型是非常简单的。文本输入与输出,不考虑文本的来源和目的地,被当做字符流处理。文本流是一个按行分割的字符序列,每行都是由零个或者多个字符组成,并以一个换行符结尾。使得每个输入或输出流都会按照这种模式工作是标准库的责任,C 语言编程者使用标准库时,不需要关心这些行在程序外是怎样表现的。

       标准库提供了一些函数以每次读取或写入一个字符,其中getcharputchar是最简单的。每次调用时,getchar函数从文本流中读取下一个输入字符并作为其返回值。也就是,在:

 

              c = getchar();

 

之后,变量c就包含了输入流中的下一个字符。字符通常来自键盘输入,从文件输入将在第7章讨论。

       每次调用putchar函数时,它就打印出一个字符:

 

              putchar(c);

 

将整型变量c作为一个字符打印出来,通常是打印在屏幕上。可以交叉调用putcharprintf函数,输出将按照调用的顺序依次显示。

 

1.5.1 文件拷贝

       有了getcharputchar函数,即使不是太了解输入与输出,你都可以写出许多有用的代码。最简单的例子就是拷贝输入到输出且每次只拷贝一个字符的程序:

 

              read a character

                  while (charater is not end-of-file indicator)

                      output the character just read

                            read a character

 

以上伪代码转变成C语言程序就是:

 

              #include <stdio.h>

 

              /* copy input to output; 1st version  */

              main()

              {

                     int c;

 

                     c = getchar();

                     while (c != EOF) {

                            putchar(c);

                            c = getchar();

                     }

              }

 

其中,关系操作符“!=”意思是“不等于”。

       实际上,键盘或屏幕上出现的字符和其他任何东西一样,在计算机内部都是以位模式存储的,类型char特指存储这样的字符类型,但是也可以使用任何整数类型。由于某种微妙但重要的原因,我们使用int

       遇到的问题是如何从有效的数据中区分出输入的末尾。解决的办法是getchar在没有更多的输入时返回一个特别的值,一个不会与任何实际的字符相混淆的值,这个值叫做:EOF,意思是指“文件末尾”。我们必须定义c为一个能够容纳任何getchar返回值的类型。我们不能使用char是因为c必须足够大来存储所有可能的char和除它们之外的EOF,所以我们使用int

       EOF是定义在<stdio.h>中的一个整数,但是只要它的值不同于所有的char值,取什么样的特殊值都没有关系。通过使用符号常量,确保了我们在程序用到的任何东西都不依赖于特殊的数据值。

       有经验的C程序员编写的拷贝程序要更简洁一些。C语言中,任何赋值语句,例如:

 

              c = getchar();

 

都是一个表达式并具有一个值,这个值就是赋值之后的等号左边的那个值,这就表示一个赋值语句可以作为一个复杂表达式的一部分。如果将给c赋值的语句放入while循环的测试条件中,这个拷贝程序就可以像这样写:

 

              #include <stdio.h>

 

              /* copy input to output; 2nd version  */

              main()

              {

                     int c;

 

                     while ((c = getchar()) != EOF)

                            putchar(c);

              }

 

       while循环接收到一个字符,并把它赋给c,然后测试该字符是否是文件末尾标记,如果不是,则执行循环体,打印出该字符,之后,while循环重复进行。最后当当到达输入末尾时,while循环和主函数结束。

       这个版本以输入作为控制——现在这只是对getchar函数的一个参考——并缩减了该程序。结果程序显得更紧凑,一旦熟悉了这种风格,程序读起来就更容易了。以后你会常常遇到这种风格。(我们将努力去克服一种趋势:着迷于某种风格而创建了不能通过的代码)。

       赋值语句两边的圆括号,在条件表达式中是必须的。“!=”的优先级高于“=”,这就意味着在缺少圆括号的关系测试中,“!=”将先于赋值“=”执行。所以下面的语句:

 

              c = getchar() != EOF

 

相当于:

 

              c = (getchar() != EOF)

 

这导致了不想要的结果:设置c为“0”或“1”,依赖于getchar是否返回文件末尾符号。(第二章有关于更多这方面的内容)。

 

练习1.6验证表达式getchar() != EOF 0,还是1

 

练习 1.7编写一个打印EOF值的程序。

 

 

1.5.2 字符统计

       下面这个程序统计字符个数,它类似于拷贝程序:

 

              #include <stdio.h>

 

              /* count characters in input; 1st version */

              main()

              {

                     long nc;

 

                     nc = 0;

                     while (getchar() != EOF)

                            ++nc;

                     printf("%ld/n", nc);

              }

 

       这条语句:

 

              ++nc;

 

出现了一个新的操作符:++,表示加1。你可以用nc = nc + 1来代替,但是++nc更简洁并且常常效率更高。与其差不多的另一个操作符:--,表示减1。操作符 ++ 可以是前缀操作符(++nc)或者后缀操作符(nc++),在不同的表达式中这两种形式有着不同的值,这会在第二章中介绍,但是,++ncnc++ 都增加了nc的值。现在我们只用到作为前缀的这种形式。

       字符统计程序将字符的个数累加在一个long型变量中,而不是int型。long型变量最少为32位。尽管在一些机器上,int型和long型存储空间大小相同,但是,在其它机器中,一个int型变量是16位的,最大值为32767,使这种int型计数器溢出只需要相对较少的输入。

       使用double型(双精度浮点型)变量可以对付更多数目的字符。我们将使用一个for语句来代替while语句,来说明编写那个循环的另一种方式:

 

              #include <stdio.h>

 

              /* count characters in input; 2nd version */

              main()

              {

                     double nc;

 

                     for (nc = 0; gechar() != EOF; ++nc)

                            ;

                     printf("%.0f/n", nc);

              }

 

printf函数使用“%f”来表示floatdouble类型,“%.0f”会隐藏小数点和小数部分的输出,这里的小数部分是0

       这里的for循环体为空,因为所有的工作已经在测试和累加部分完成了。但是C语言的文法规则要求一个for循环语句有一个循环体。单独的分隔符,称为空语句,在这里正好满足了这个要求。我们将它放在单独的一行里让它能被看见。

       在我们离开字符统计程序之前,需要注意到如果输入中没有字符,while或者for循环在第一次调用getchar函数时测试条件不成立,程序产生0,正确的结果。这很重要,whilefor循环的一个极好的地方是它们在循环的开始处测试条件,就是在处理循环体之前。如果没有什么要做的,则什么也不会被完成,甚至是这意味着不会进入循环体。程序应该在给出零长度输入时做合理的动作。whilefor循环可以确保在边界条件内做合理的事情。

 

1.5.3 行数统计

       下面这个程序统计输入的行数。上面我们已经提到,标准库确保一个输入文本流以行序列的形式存在,每一行都以换行符结束。所以,统计行数就是统计换行符的个数:

 

              #include <stdio.h>

 

              /* count lines in input */

              main()

              {

                     int c, nl;

 

                     nl = 0;

                     while ((c = getchar()) != EOF)

                            if (c == '/n')

                                   ++nl;

                     printf("%d/n", nl);

              }

 

       这里的while循环体由一条if语句组成,它控制累加语句++n1if语句测试圆括号里面的条件,如果条件为真,则执行随后的语句(或者大括号里面的一组语句)。我们再次用缩进的方式显示了什么被什么控制着。

       双等于号“==”是C语言中的一个代表“是否等于”的符号(就像Pascal语言中的一个“=”或者Fortran语言中的“.EQ.”)。这个符号是用来将是否等于判断与C语言中赋值的单个“=”相区别。一点警告:初次接触C语言的人有时在想要表示“==”时,却写成了“=”。就像我们将要在第二章里看到的一样,这样做的结果通常是一个合法的表达式,所以你将不会得到警告。

       单引号中的一个字符代表着一个整型值,该值等于特定机器的字符集中的该字符的编码值。这个叫做字符常量,然而,这只是表示一个小整数的另一种方式。所以,例如:‘A’就是一个字符常量,在ASCII字符集中它的值为65,就是字符A在机器内的内部表示。当然,‘A’代表65是首选,它的意思很明显,同时又独立于某个特定的字符集。

       字符串常量中的转义序列在字符常量中也是合法的,所以,‘/n’代表换行符的值,该值在ASCII表中是10。你应该小心注意‘/n’是一个单个字符,在表达式中只是一个整数,另一方面,‘/n’又表示仅仅包含一个字符的字符串常量。字符串和字符比较的话题将在第二章中更深入的讨论。

 

练习1-8写一个程序,用来统计空格、制表符和换行符的数目。

 

练习1-9写一个程序,将输入复制到输出,并用单个空格字符代替字符串中的一个或多个空格串。

 

练习1-10写一个程序,将输入复制到输出,并用“/t”替换每个制表符,用“/b”替换每个退格符,以及用“//”替换每个反斜杠。这使得制表符和退格符清楚可见。

 

1.5.4 单词统计

       我们一系列实用程序中的第四个是统计行数、单词和字符个数,做如下不精确的定义:一个单词是任何不包含空格、制表符或换行符的字符序列。下面这是一个参考的UNIX程序:wc

 

              #include <stdio.h>

 

              #define IN   1  /* inside a word */

              #define OUT  0  /* outside a word */

 

              /* count lines, words, and characters in input */

              main()

              {

                     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);

              }

 

每当这个程序遇到一个单词的第一个字符时,它就统计又一个单词。state变量记录程序当前是否在一个单词内,初始时它被复制为“OUT”,表示“不在一个单词内”。我们使用符号常量“IN”和“OUT”而不用字面值10,是因为它们使得程序的可读性更高。在一个像这样小的程序里,这没有太大的区别,但是在大的程序中,从一开始就适度的付出额外的努力以这种方式编写程序以增加其清晰性是值得的。你将发现在程序中做大范围的修改会变得更容易,这些程序中的“神奇数字”仅仅作为符号常量出现。

       这一行:

 

              nl = nw = nc = 0;

 

设置三个变量都为零。这不是特例,而是由于一个赋值语句是一个有值和从右到左赋值的表达式这个事实导致的结果。它就像我们这样写:

 

              nl = (nw = (nc = 0));

 

       操作符“||”表示“OR”,所以,这一行,

 

              if (c == ‘ ‘ || c == ‘/n’ || c = ‘/t’)

 

表示“如果c是一个空格或c是一个换行符或c是一个制表符”。(回想一下转义序列“/t”是一个制表符的显示表示。)另外还有对应的操作符“&&”表示“AND”,它的优先级恰好比“||”大。由“&&”或“||”连接的表达式都是从左到右进行评估的,并且保证当真值或假值确定时评估会立即停止。如果c是一个空格,就没有必要再去测试它是否为一个换行符或制表符了,所以不会进行这些测试。这里并不是很重要,但是我们不久将要看到,这在更为复杂的情况中是有意义的。

       例子中也展示了一个“else”,它指定了一个在if语句的条件部分为假时可选的动作。一般形式为:

 

              if (expression)

                     statement1;

              else

                     statement2;

 

由一个if-else连起来的两个“statement”中有一个且只有一个被执行。如果“expression”为真,则“statement1”被执行;如果不是,则“statement2”被执行。每个“statement”可以是单条语句或者是大括号中的一组语句。总之,统计程序中“else”后面是一条if语句,而该if语句控制着大括�%e="font-size: small;">              {

                     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);

 

              c = getchar();

 

之后,变量c就包含了输入流中的下一个字符。字符通常来自键盘输入,从文件输入将在第7章讨论。

       每次调用putchar函数时,它就打印出一个字符:

 

              putchar(c);

 

将整型变量c作为一个字符打印出来,通常是打印在屏幕上。可以交叉调用putcharprintf函数,输出将按照调用的顺序依次显示。

 

1.5.1 文件拷贝

       有了getcharputchar函数,即使不是太了解输入与输出,你都可以写出许多有用的代码。最简单的例子就是拷贝输入到输出且每次只拷贝一个字符的程序:

 

              read a character

                  while (charater is not end-of-file indicator)

                      output the character just read

                            read a character

 

以上伪代码转变成C语言程序就是:

 

              #include <stdio.h>

 

              /* copy input to output; 1st version  */

              main()

              {

                     int c;

 

                     c = getchar();

                     while (c != EOF) {

                            putchar(c);

                            c = getchar();

                     }

              }

 

其中,关系操作符“!=”意思是“不等于”。

       实际上,键盘或屏幕上出现的字符和其他任何东西一样,在计算机内部都是以位模式存储的,类型char特指存储这样的字符类型,但是也可以使用任何整数类型。由于某种微妙但重要的原因,我们使用int

       遇到的问题是如何从有效的数据中区分出输入的末尾。解决的办法是getchar在没有更多的输入时返回一个特别的值,一个不会与任何实际的字符相混淆的值,这个值叫做:EOF,意思是指“文件末尾”。我们必须定义c为一个能够容纳任何getchar返回值的类型。我们不能使用char是因为c必须足够大来存储所有可能的char和除它们之外的EOF,所以我们使用int

       EOF是定义在<stdio.h>中的一个整数,但是只要它的值不同于所有的char值,取什么样的特殊值都没有关系。通过使用符号常量,确保了我们在程序用到的任何东西都不依赖于特殊的数据值。

       有经验的C程序员编写的拷贝程序要更简洁一些。C语言中,任何赋值语句,例如:

 

              c = getchar();

 

都是一个表达式并具有一个值,这个值就是赋值之后的等号左边的那个值,这就表示一个赋值语句可以作为一个复杂表达式的一部分。如果将给c赋值的语句放入while循环的测试条件中,这个拷贝程序就可以像这样写:

 

              #include <stdio.h>

 

              /* copy input to output; 2nd version  */

              main()

              {

                     int c;

 

                     while ((c = getchar()) != EOF)

                            putchar(c);

              }

 

       while循环接收到一个字符,并把它赋给c,然后测试该字符是否是文件末尾标记,如果不是,则执行循环体,打印出该字符,之后,while循环重复进行。最后当当到达输入末尾时,while循环和主函数结束。

       这个版本以输入作为控制——现在这只是对getchar函数的一个参考——并缩减了该程序。结果程序显得更紧凑,一旦熟悉了这种风格,程序读起来就更容易了。以后你会常常遇到这种风格。(我们将努力去克服一种趋势:着迷于某种风格而创建了不能通过的代码)。

       赋值语句两边的圆括号,在条件表达式中是必须的。“!=”的优先级高于“=”,这就意味着在缺少圆括号的关系测试中,“!=”将先于赋值“=”执行。所以下面的语句:

 

              c = getchar() != EOF

 

相当于:

 

              c = (getchar() != EOF)

 

这导致了不想要的结果:设置c为“0”或“1”,依赖于getchar是否返回文件末尾符号。(第二章有关于更多这方面的内容)。

 

练习1.6验证表达式getchar() != EOF 0,还是1

 

练习 1.7编写一个打印EOF值的程序。

 

 

1.5.2 字符统计

       下面这个程序统计字符个数,它类似于拷贝程序:

 

              #include <stdio.h>

 

              /* count characters in input; 1st version */

              main()

              {

                     long nc;

 

                     nc = 0;

                     while (getchar() != EOF)

                            ++nc;

                     printf("%ld/n", nc);

              }

 

       这条语句:

 

              ++nc;

 

出现了一个新的操作符:++,表示加1。你可以用nc = nc + 1来代替,但是++nc更简洁并且常常效率更高。与其差不多的另一个操作符:--,表示减1。操作符 ++ 可以是前缀操作符(++nc)或者后缀操作符(nc++),在不同的表达式中这两种形式有着不同的值,这会在第二章中介绍,但是,++ncnc++ 都增加了nc的值。现在我们只用到作为前缀的这种形式。

       字符统计程序将字符的个数累加在一个long型变量中,而不是int型。long型变量最少为32位。尽管在一些机器上,int型和long型存储空间大小相同,但是,在其它机器中,一个int型变量是16位的,最大值为32767,使这种int型计数器溢出只需要相对较少的输入。

       使用double型(双精度浮点型)变量可以对付更多数目的字符。我们将使用一个for语句来代替while语句,来说明编写那个循环的另一种方式:

 

              #include <stdio.h>

 

              /* count characters in input; 2nd version */

              main()

              {

                     double nc;

 

                     for (nc = 0; gechar() != EOF; ++nc)

                            ;

                     printf("%.0f/n", nc);

              }

 

printf函数使用“%f”来表示floatdouble类型,“%.0f”会隐藏小数点和小数部分的输出,这里的小数部分是0

       这里的for循环体为空,因为所有的工作已经在测试和累加部分完成了。但是C语言的文法规则要求一个for循环语句有一个循环体。单独的分隔符,称为空语句,在这里正好满足了这个要求。我们将它放在单独的一行里让它能被看见。

       在我们离开字符统计程序之前,需要注意到如果输入中没有字符,while或者for循环在第一次调用getchar函数时测试条件不成立,程序产生0,正确的结果。这很重要,whilefor循环的一个极好的地方是它们在循环的开始处测试条件,就是在处理循环体之前。如果没有什么要做的,则什么也不会被完成,甚至是这意味着不会进入循环体。程序应该在给出零长度输入时做合理的动作。whilefor循环可以确保在边界条件内做合理的事情。

 

1.5.3 行数统计

       下面这个程序统计输入的行数。上面我们已经提到,标准库确保一个输入文本流以行序列的形式存在,每一行都以换行符结束。所以,统计行数就是统计换行符的个数:

 

              #include <stdio.h>

 

              /* count lines in input */

              main()

              {

                     int c, nl;

 

                     nl = 0;

                     while ((c = getchar()) != EOF)

                            if (c == '/n')

                                   ++nl;

                     printf("%d/n", nl);

              }

 

       这里的while循环体由一条if语句组成,它控制累加语句++n1if语句测试圆括号里面的条件,如果条件为真,则执行随后的语句(或者大括号里面的一组语句)。我们再次用缩进的方式显示了什么被什么控制着。

       双等于号“==”是C语言中的一个代表“是否等于”的符号(就像Pascal语言中的一个“=”或者Fortran语言中的“.EQ.”)。这个符号是用来将是否等于判断与C语言中赋值的单个“=”相区别。一点警告:初次接触C语言的人有时在想要表示“==”时,却写成了“=”。就像我们将要在第二章里看到的一样,这样做的结果通常是一个合法的表达式,所以你将不会得到警告。

       单引号中的一个字符代表着一个整型值,该值等于特定机器的字符集中的该字符的编码值。这个叫做字符常量,然而,这只是表示一个小整数的另一种方式。所以,例如:‘A’就是一个字符常量,在ASCII字符集中它的值为65,就是字符A在机器内的内部表示。当然,‘A’代表65是首选,它的意思很明显,同时又独立于某个特定的字符集。

       字符串常量中的转义序列在字符常量中也是合法的,所以,‘/n’代表换行符的值,该值在ASCII表中是10。你应该小心注意‘/n’是一个单个字符,在表达式中只是一个整数,另一方面,‘/n’%B                   for (nc = 0; gechar() != EOF; ++nc)

                            ;

                     printf("%.0f/n", nc);

              }

 

printf函数使用“%f”来表示floatdouble类型,“%.0f”会隐藏小数点和小数部分的输出,这里的小数部分是0

       这里的for循环体为空,因为所有的工作已经在测试和累加部分完成了。但是C语言的文法规则要求一个for循环语句有一个循环体。单独的分隔符,称为空语句,在这里正好满足了这个要求。我们将它放在单独的一行里让它能被看见。

       在我们离开字符统计程序之前,需要注意到如果输入中没有字符,while或者for循环在第一次调用getchar函数时测试条件不成立,程序产生0,正确的结果。这很重要,whilefor循环的一个极好的地方是它们在循环的开始处测试条件,就是在处理循环体之前。如果没有什么要做的,则什么也不会被完成,甚至是这意味着不会进入循环体。程序应该在给出零长度输入时做合理的动作。whilefor循环可以确保在边界条件内做合理的事情。

 

1.5.3 行数统计

       下面这个程序统计输入的行数。上面我们已经提到,标准库确保一个输入文本流以行序列的形式存在,每一行都以换行符结束。所以,统计行数就是统计换行符的个数:

 

              #include <stdio.h>

 

              /* count lines in input */

              main()

              {

                     int c, nl;

 

                     nl = 0;

                     while ((c = getchar()) != EOF)

                            if (c == '/n')

                                   ++nl;

                     printf("%d/n", nl);

              }

 

       这里的while循环体由一条if语句组成,它控制累加语句++n1if}

                     printf("%d %d %d/n", nl, nw, nc);

              }

 

每当这个程序遇到一个单词的第一个字符时,它就统计又一个单词。state变量记录程序当前是否在一个单词内,初始时它被复制为“OUT”,表示“不在一个单词内”。我们使用符号常量“IN”和“OUT”而不用字面值10,是因为它们使得程序的可读性更高。在一个像这样小的程序里,这没有太大的区别,但是在大的程序中,从一开始就适度的付出额外的努力以这种方式编写程序以增加其清晰性是值得的。你将发现在程序中做大范围的修改会变得更容易,这些程序中的“神奇数字”仅仅作为符号常量出现。

       这一行:

 

              nl = nw = nc = 0;

 

设置三个变量都为零。这不是特例,而是由于一个赋值语句是一个有值和从右到左赋值的表达式这个事实导致的结果。它就像我们这样写:

 

              nl = (nw = (nc = 0));

 

       操作符“||”表示“OR”,所以,这一行,

 

              if (c == ‘ ‘ || c == ‘/n’ || c = ‘/t’)

 

表示“如果c是一个空格或c是一个换行符或c是一个制表符”。(回想一下转义序列“/t”是一个制表符的显示表示。)另外还有对应的操作符“&&”表示“AND”,它的优先级恰好比“||”大。由“&&”或“||”连接的表达式都是从左到右进行评估的,并且保证当真值或假值确定时评估会立即停止。如果c是一个空格,就没有必要再去测试它是否为一个换行符或制表符了,所以不会进行这些测试。这里并不是很重要,但是我们不久将要看到,这在更为复杂的情况中是有意义的。

       例子中也展示了一个“else”,它指定了一个在if语句的条件部分为假时可选的动作。一般形式为:

 

              if (expression)

                     statement1;

              else

                     statement2;

 

由一个if-else连起来的两个“statement”中有一个且只有一个被执行。如果“expression”为真,则“statement1”被执行;如果不是,则“statement2”被执行。每个“statement”可以是单条语句或者是大括号中的一组语句。总之,统计程序中“else”后面是一条if语句,而该if语句控制着大括号中的两条语句。

 

练习1-11你将怎样测试这个单词统计程序?如果存在一些错误,什么样的输入能尽可能的这些错误?

 

练习1-12编写一个程序,按每行一个单词的格式打印输入。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《C Primer 中文版(第5版)》是一本非常经典的C语言学习教材,其分为18章,内容从简单的语法讲解到高级语言特性,非常全面。书中通过大量实例介绍了C语言的各种基础概念,例如:变量、函数、数组、指针和结构体等,包含了语言的所有核心要点,并且通过编程实践帮助读者快速掌握语法知识。此外,本书着重于C语言与C++语言的区别与联系,介绍了C语言与C++语言的相似点与不同之处,帮助读者更好地理解这两种语言。书中的练习题有助于巩固所学知识,提高编程思维。本书不仅适用于有编程基础的读者,还适合初学者学习。总之,《C Primer 中文版(第5版)》是一本高质量的教材,不论是学习编程还是提高技能都是必读的书籍之一。 ### 回答2: 《C Primer 中文版》第五版是一本C语言入门的经典教材。它通过清晰而详细的讲解和大量的实例案例,帮助读者真正理解C语言的基础知识和编程技巧。本书共分为18章,从C语言基础数据类型、算术运算符和控制语句开始讲起,一直解释到高级操作,如函数指针和位运算等。 此外,本书还介绍了C语言中常用的数据类型、函数、指针、字符串、结构体、共用体、位操作以及文件操作等知识点。不仅如此,每一章节结尾还提供了大量的练习题目,并配有答案和解析,有助于提高读者的理解和实战能力。 值得一提的是,本书特别适合初学者学习。在阐述概念的同时,作者以简单易懂的方式呈现实际应用场景,让读者理解问题的本质和解决方案,避免了知识的孤立性和抽象性,提高了学习效率。 总之,《C Primer 中文版》第五版是一本入门级的C语言教材,涵盖了C语言基础知识和编程技巧,可供初学者参考和学习。本书适合自学或作为课程的教材使用。建议学习者掌握C语言基础后,再深入学习与实践。 ### 回答3: 《C Primer中文版(第5版)》是一本C语言入门级别的教材,主要介绍了C语言的基本概念、语法规则、程序设计方法以及C语言的特点和应用领域等方面的内容。本书内容丰富、系统性强,适合初学者从零起步学习。 本书共分为18章,内容包括基本数据类型、数组、字符序列和字符串、指针、函数、结构体和联合体、动态内存分配、位运算、输入输出、预处理器和C库等。同时,本书也介绍了一些实际应用案例,例如文件操作和排序算法等,可以帮助读者更好地理解和应用C语言。 除了书籍内容之外,本书还有一些非常实用的附录,例如C语言关键字和标识符、ASCII码表、格式说明符和转义字符等,可以帮助读者更加深入地了解C语言的具体使用方法。 总之,《C Primer中文版(第5版)》是一本很好的C语言入门教材,无论是初学者还是对C语言有一定了解的读者都可以从中获得很多帮助和收获。同时,本书语言简洁清晰,结构合理,对于初学者来说,是一本很好的自学教材。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值