《C和指针》学习笔记(2)

1.1  “hello world”程序不说了,codeblocks直接生成。

1.2   题目:从标准输入读取几行输入。每行输入都要打印到标准输出上,前面要加上行号。让程序能够处理的输入行没有长度限制。

/*我的程序*//*
int main()
{
   int ch;
   int line=1;
   while((ch=getchar())!=EOF)
   {
       printf("%d",line);
       if(ch!=‘\n‘)
        printf("%c",ch);
       else
       {
            printf("\n");
            line++;
       }
   }
   return EXIT_SUCCESS;
}*/

/*答案解析*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int ch,line=0,at_beginning=1;//书上甚至是分开初始化和赋值的,估计是为了照顾初学者吧。
    while((ch=getchar())!=EOF)
    {
        if(at_beginning==1){
            at_beginning=0;
            line+=1;
            printf("%d",line);
        }
        putchar(ch);
        if(ch==‘\n‘)
            at_beginning=1;
    }
    return EXIT_SUCCESS;
}
/*看完答案真的明白自己的差距了,设置at_beginning没有想到,
感觉自己用习惯了scanf和printf,getchar和putchar感觉反而忘记了。
*/

这道题错很不应该。至于为什么getchar函数,主要是为了让输入行没有长度限制,一个个字符读入。

1.3 题目:从标准输入读取一些字符,并把它们写到标准输出上。他同时应该计算checksum值,并写在字符的后面。checksum用一个signed char类型的变量计算,初始为-1.当每个字符从标准输入读取的时候,他就被加到checksum中。如果checksum变量产生了溢出,这些溢出就会被忽略。当所有的字符被写入后程序已十进制的整数的格式打印出checksum的值,他可能为负,注意要在它后面打一个换行符。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    signed char checksum=-1;
    int ch;
    while((ch=getchar())!=EOF)
    {
        putchar(ch);
        checksum+=ch;
    }
    printf("%d\n",checksum);
    return EXIT_SUCCESS;
}

  书上没有标准答案,但我运行的结果也正确了,因为题目要求在文件中运行,所以我就改造到了shell窗口,理解就好了。不必纠结这种细节。最重要的是,我发现《C和指针》很少用char 来定义一个字符型变量,例如char ch很少见,我看到书上的解释是这样的:EOF是一个整型,因而它的位数比字符型要多,把ch声明为整形可以防止从输入读取的字符被解释为EOF,而且ch要足够大足以容纳EOF,所以定义为int.

  同时我一直以为只有char类型,这次才知道还有unsigned char(0~255) 和signed char(-128~127),至于我们的char类型默认的是signed还是unsigned,根据IDE而定都有区别。我的codeblocks是signed。其实想想也好理解不管哪种字符型都是8个字节,只不过后者最高位是符号位,所以范围只能到127.貌似这种细节自己总会在意。。。

1.4

一行行地读取输入行,直至达到文件尾。算出每行输入行的长度,然后把最长的那一行打出来,假定输入行不超过1000个字符。

#include <stdio.h>
#include <stdlib.h>
#define N 1000         //输入行的最大长度
#define M 20         //输入的行数最大值
int main()
{
    char b[M][M];
    int a[M]={0},i=0,j,k,max,flag=1; /*ch用来读取字符,a这个数组用来储存各个行的长度
                                 i用来表示行号*/
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            b[i][j]=getchar();
            a[i]++;
            if(b[i][j]==EOF)
            {
                flag=0;
                break;
            }
            if(b[i][j]==‘\n‘)
                break;
        }
        if(!flag)
            break;
    }
    max=0;
    for(k=0;k<i;k++)
    {
        if(a[max]<a[k])
            max=k;
    }
    j=0;
    do{
        printf("%c",b[max][j]);
        j++;
    } while(b[max][j]!=‘\n‘);
    return EXIT_SUCCESS;
}

  不得不说,这道题我觉得写的很不好,但是没有书上答案,我的程序也可以AC,但是作为强迫症我总感觉不美,给我一种类似使用goto语句的感觉。记得别人说过,使用goto语句的数目与这个人的编程能力成反比。首先,我觉得应该书上应该还是想要用int ch这种定义方式,但我最终还是采用了熟悉的二维数组方式。最让我感觉不好的地方,是因为CtrlZ的问题(貌似和键盘输入输出就有它的问题吧)。因为如果要结束输入就得单独在一行中CtrlZ,在一行有其他字符的末尾输入EOF是不管用的,程序输入不会结束。而如果你在下一行并不输入CtrlZ而是其他字符,IDE会把这两行以某种方式当做同一行输出。所以这里面其实是很有问题的。当然我们要结束输入的时候一般输入CtrlZ不会再输入其他字符的,所以在实际运用中应该没有这些问题。把题目也写出来了,如果有人能写出更好的,希望得到指点。因为我知道自己的并不好。还有两道练习题,明天再写吧。

时间: 2024-08-01 16:10:33

《C和指针》学习笔记(2)的相关文章

&lt;&lt;linux命令行与shell脚本编程大全&gt;&gt;学习笔记(1)

一章初识linux shell 一.什么是linux 1.linux系统可大致划分为四部分: l Linux内核 l GNU工具组件 l 图形化桌面环境 l 应用软件 在linux系统里,这四部分中的每一部分都扮演着一个特别的角色,但如果将他们分开,每一部分都没太大的作用. 1)探究linux内核 Linux系统的核心是内核,内核控制着计算机系统上的所有硬件和软件,必要时分配硬件,有时需要执行软件. 内核基本负责以下四项主要功能: l 系统内存管理 l 软件程序管理 l 硬件设备管理 l 文件系

《Linux命令行与shell脚本编程大全》学习笔记(转)

第一部分:Linux命令行<Linux命令行与shell脚本编程大全> 第一章:初识Linux shell<Linux命令行与shell脚本编程大全> 第二章:走进shell<Linux命令行与shell脚本编程大全> 第三章:基本的bash shell命令<Linux命令行与shell脚本编程大全> 第四章:更多的bash shell命令<Linux命令行与shell脚本编程大全> 第五章:使用Linux环境变量<Linux命令行与she

【持续更新中】Linux命令行与Shell脚本编程大全(第3版)读书笔记12-20章

<Linux命令行与Shell脚本编程大全(第3版)>读书笔记 第十二章 使用结构化命令 根据条件使脚本跳过某些命令,这样的命令称为结构化命令(structured command).结构化命令允许改变程序执行的顺序. If-then语句: If command Then Commands Fi 如果if后的command执行退出码是0(也就是执行成功了),then后面的语句就会被执行. 也可以写成: If command; then Commands Fi 注意了,if后的command结果

Linux命令行与shell脚本编程大全.第3版(文字版) 超清文字-非扫描版 [免积分、免登录]

此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Linux命令行与shell脚本编程大全.第3版 (大小:约22M) 原文地址:https://www.cnblogs.com/pluse/p/9408724.html

《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf

下载地址:网盘下载 内容简介  · · · · · · 本书是一本关于Linux 命令行与shell 脚本编程的全面教程.全书分为四部分:第一部分介绍Linuxshell 命令行:第二部分介绍shell 脚本编程基础:第三部分深入探讨shell 脚本编程的高级内容:第四部分介绍如何在现实环境中使用shell 脚本.本书不仅涵盖了详尽的动手教程和现实世界中的实用信息,还提供了与所学内容相关的参考信息和背景资料. 本书内容全面,语言简练,示例丰富,适合于linux 系统管理员及Linux 爱好者阅读

《Linux命令行与shell脚本编程大全 第3版》

第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81.2   Linux 发行版 121.2.1 核心Linux 发行版 131.2.2 特定用途的Linux 发行版 131.2.3 Linux LiveCD 141.3   小结 15 第2章  走进shell2.1   进入命令行 162.1.1 控制台终端 172.1.2 图形化终端 172.2

《Linux命令行与shell脚本编程大全》23章24章

第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百科上说:Dash shell是一个Unix shell,比Bash shell小的多,符合POSIX标准. 下面是书上的: dash shell是作为debian linux发行版的一部分开发的,主要出现在Ubuntu linux发行版中.它是Bourne shell的精简版.所以它并不像bashs

【更新完毕】Linux命令行与Shell脚本编程大全(第3版)读书笔记21-26章

第二十一章 sed进阶 N:将数据流中的下一行加进来创建一个多行组(multiline group)来处理. D:删除多行组中的第一行. P:打印多行组中的第一行. sed '/header/{n ; d}' data.txt 首先匹配有header的行,然后n表示移动到文本的下一行,然后进行删除.然后继续搜索data.txt中包含header的行,继续之前的流程. 加入有个文本的内容如下: [[email protected] ~]# cat data.txt On Tuesday, the

《Linux命令行与Shell脚本编程大全(第3版)》读书笔记

第一章 初始Linux Shell Linux可以划分为4个部分: - Linux内核 - GNU工具 - 图形化桌面环境 - 应用软件 Linux系统的核心是内核.内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件. 内核主要负责以下4种功能: - 系统内存管理 - 软件程序管理 - 硬件设备管理 - 文件系统管理 操作系统内核的主要功能之一就是内存管理.内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存). 内核通过硬盘上的存储空间来

《Linux命令行与shell脚本编程大全》 第六章环境变量

很多程序和脚本都通过环境变量来获取系统信息.存储临时数据和配置信息. 6.1 什么是环境变量: bash shell用一个叫环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息. 这项特性允许在内存中存储数据,以便程序能轻松访问到它们. 在bash shell中,分两类: 全局变量:对于shell会话和所有生成的子shell都是可见的 局部变量:只对创建的它们的shell可见 6.1.1全局环境变量 查看全局变量,  $env    $printen