小白学习日记之字符的赋值

本文详细介绍了在编程中单个字符与字符串的多种赋值方法,包括直接赋值、ASCII码赋值、十六进制赋值等,并探讨了字符串整体与逐个赋值的区别及注意事项。

字符的输入可分为单个字符的赋值及字符串的赋值,此处分开就就讨论。
单个字符的赋值
这里只讨论直接赋值,以输入字符A为例,字母A的ASCII码八进制为101,十进制为65,十六进制为41。
令c为单个字符型变量(char c;),将A赋值给c有如下办法:
c=‘A’;
c=’\101’; //八进制,反斜杠+1~3位数字,注意有单引号;
c=65; //十进制,注意此时不用单引号,也不用反斜杠,
c=0101; //八进制;
c=0x41; ;//十六进制;
c=’\x41’; //十六进制,反斜杠+x+两位数字,注意有单引号;

综上,单个字符的输入办法有4种,反斜杠这类在字符串中也可使用,讨论以上办法不是为了用花里胡哨的方法进行输入,而是要明白,单个字符它可以转化为整数,并且在ASCII码中0~9,a~z,A~Z,是连续的,也就是当读取字符c,其值为字符9,可以通过c-'0’这个式子得到整数型9等,当然他还有其他的运用,以后一空想到再一一补上。

字符串的赋值
字符串的赋值可以单个地赋值,也可以整体赋值,此处分开讨论。

整体赋值只能在定义字符的时候进行,不能分开进行。
比如char a[]=“hello!”; 注意,此处用双引号,长度可以不写,如果要写则应该写char a[7]=“hello!”;这是因为除了内容本身占用六个字符外,还需有一个字符储存标识结束的字符’\0’,但此时用strlen(a)查询变量长度,则度还是6。这个在逐个赋值上也一样,如果最终赋值的字符数量为n,则字符串的长度应至少为 n+1。
char a[]="\150\145\154\154\157\041";可以达到和上面同样赋值的效果,转义在字符串中同样有作用。

逐个赋值同单个字符串赋值差不多,此处不过多讨论,需强调的是,字符串的下标从0从开始,整体赋值系统会在末尾自动添加’\0’,标识结尾,单个赋值后,需自己添加末尾结束符。如赋值完hello!后,需在操作a[6]=’\0’;另外a[n]本质是一个指针,并不能识别其范围是否超过了定义,比如定义了字符串的长度为7,但是对a[7],a[8]进行赋值,系统不会报错,在这些地址的内容没有被其他程序改写前甚至可以正常调用,但是其危害是十分明显的,a[7],a[8]有可能被其他程序改写,造成信息的丢失。比如:
char a[7]="hello!";//此时a占有的空间是7个字符,长度为6; a[6]=65; a[7]=65; a[8]='\0'; printf("字符串内容是:--%s\n--字符串长度是:%d\n--字符串a占用的空间是%d个字符\n",a,strlen(a),sizeof(a)/sizeof(char));这些操操作后,printf的结果为字符串内容是:
–hello!AA
–字符串长度是:8
–字符串a占用的空间是7个字符

日记 作者 郑珺 单位 浙江传媒学院 小朋友有写日记的习惯,但有一个奇怪的规定,日记中不能出现字符#。 (1)编写一个类DiaryBook表示日记本,包含以下成员 ①属性: author:私有,String型,表示作者。 content:私有,String型,表示日记本中的内容。 ②方法: DiaryBook(String author),构造方法,用参数初始化姓名,将内容初始化空字符串; DiaryBook(String author, String content),构造方法,用参数分别初始化作者和内容; 为author和content添加getter和setter方法。 write(char c)方法,往日记内容中写入一个字符。如果c是#号,抛出IllegalArgumentException异常;否则,往content末尾添加字符c; write(String newContent)方法,往日记内容中写入一个字符串。调用write(char c)方法,将字符串中的字符依次写入日记中;一旦捕捉到异常,终止写操作;无论是否有异常,都要往日记内容末尾添加一个换行符; boolean equals(Object obj)方法,比较当前对象和参数obj是否相等,如果obj是日记本对象,返回当前对象和obj的内容是否完全相同;如果obj不是日记本对象,返回false。 一个toString()方法,返回日记本的作者和内容等信息。 (2)构造一个Main类。 在main方法中,为小明和小白各创建一个日记本对象。小明的日记本内容初始为空字符串,随后往其中写入5行文字。小白的日记本内容初始就有一行文字,随后往其中写入4行文字。 最后比较并输出两者的日记内容是否相同。 import java.util.Scanner; class DiaryBook { private String author; private String content; public DiaryBook(String author) { this.author = author; } public DiaryBook(String author, String content) { this.author = author; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public void write(char c) { if(c != ) { content += c; } else { new IllegalArgumentException("日记中不能出现#号!"); } } public void write(String newContent) { { for (int i = 0; i < newContent. ; i++) { write(newContent. ); } } catch ( e){ System.out.println("出现异常:" + .getMessage()); } { content += ; } } @Override public boolean equals(Object obj) { if(obj DiaryBook){ return content.equals( ); } else { return ; } } @Override public String toString() { return author + "的日记:\n" + content; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); DiaryBook a = new DiaryBook("小明"); for(int i = 0; i < 5; i++){ a.write(scanner.nextLine()); } System.out.println(a); DiaryBook b = new DiaryBook("小白", scanner.nextLine() + "\n"); for(int i = 0; i < 4; i++){ b.write(scanner.nextLine()); } System.out.println(b); if( ){ System.out.println("两本日记完全相同"); } else { System.out.println("两本日记不同"); } } } 输入样例: 6月11日,今天复习了类和对象 6月12日,今天复习了继承#和多态 6月13日,明天要考试? 6月14日,今天要考Java#? 6月15日,昨天考的是Java? 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? 输出样例: 出现异常:日记中不能出现#号! 出现异常:日记中不能出现#号! 小明的日记: 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? 小白的日记: 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? 两本日记完全相同
最新发布
11-19
<think> 题目要求:实现日记本类,并按照要求完成填空。 根据题目要求,我们需要完成DiaryBook类,并实现其所有方法,然后在Main类中完成测试。 注意点: 1. 日记本中不能出现字符'#',所以write(char c)方法中,如果遇到'#'要抛出IllegalArgumentException异常。 2. write(String newContent)方法:依次写入字符串中的每个字符,如果遇到异常,捕获后打印异常信息,然后终止本次写入操作(即不再写入该字符串剩余的字符),但最后不管是否出现异常,都要在日记内容末尾添加一个换行符。 3. equals方法:如果obj是DiaryBook类型,则比较两者的content是否相同(注意:这里题目要求返回当前对象和obj的内容是否完全相同,所以直接比较content字符串即可);否则返回false。 4. 在Main类中,我们创建两个日记本对象,分别输入若干行,最后比较两个日记本的内容是否相同。 填空详解: 1. 构造方法中,第一个构造方法将内容初始化为空字符串,所以填空为:this.content = ""; 2. 第二个构造方法:this.content = content; 但是注意,题目要求初始内容就是参数content,所以直接赋值。 3. write(char c)方法:判断c是否等于'#',所以第一个空填'#';如果等于,则抛出异常,所以第二个空填throw。 4. write(String newContent)方法:我们需要遍历字符串的每个字符,所以先获取字符串的长度,然后逐个字符写入。因此,第三个空填try(因为要捕获异常),第四个空填length()(获取字符串长度),第五个空填charAt(i)(取第i个字符)。捕获异常时,捕获的是IllegalArgumentException,第六个空填IllegalArgumentException,第七个空填e。无论是否异常都要添加换行符,所以第八个空填finally(或者使用try-catch-finally结构,但是题目已经给了三个块:try、catch、最后一个空,从上下文看,这里应该是finally块,但注意题目要求无论是否有异常都要添加换行符,所以也可以不用finally,因为catch后面直接写添加换行符的代码?但是题目中已经划分了三个块:try、catch、以及一个空白块(这里应该是finally,因为题目要求无论是否有异常都要添加换行符)。所以第八个空填finally,第九个空填"\n"(换行符)。 5. equals方法:判断obj是否是DiaryBook类型,使用instanceof,所以第十个空填instanceof;如果是,则比较两个日记本的内容,所以第十一个空填((DiaryBook)obj).content;否则返回false,所以第十二个空填false。 6. 在Main类中,最后比较两个日记本对象a和b是否相等,所以第十三个空填a.equals(b)。 注意:在write(String newContent)方法中,我们使用try-catch-finally结构。在try块中循环写入每个字符,如果遇到非法字符('#')会抛出异常,被catch捕获,然后打印异常信息,此时循环终止(因为异常跳出循环)。然后finally块中会添加换行符。注意,即使没有异常,最后也要添加换行符。 但是,这里有一个问题:如果我们在写入字符串的过程中,中间某个字符抛出了异常,那么该字符串后面的字符就不会再写入,然后添加换行符。这符合题目要求:一旦捕捉到异常,终止写操作;无论是否有异常,都要往日记内容末尾添加一个换行符。 另外,在Main类中,我们创建两个日记本: a: 小明的日记本,初始内容为空,然后写入5行(每次一行) b: 小白的日记本,初始内容为第一行(从输入读取的第一行),然后写入4行(共5行) 输入样例有6行(第一行被小白初始日记本使用,然后后面5行被小明写入5行,接着小白再写入4行?但是注意代码中: - 创建a(小明)后,循环5次,每次读取一行,调用a.write(一行) - 然后创建b(小白),初始内容为scanner.nextLine(),并加上换行符(注意初始构造时已经加了一个换行符,但题目要求初始内容为一行文字,然后我们加上一个换行符,这样后面写入的字符串会从下一行开始) - 然后循环4次,每次读取一行,写入b 输入样例: 第1行:6月11日,今天复习了类和对象 第2行:6月12日,今天复习了继承#和多态 -> 这一行写入时遇到#会异常 第3行:6月13日,明天要考试? 第4行:6月14日,今天要考Java#? -> 遇到#异常 第5行:6月15日,昨天考的是Java? 第6行:6月11日,今天复习了类和对象 -> 这是小白日记本的初始内容 然后后面4行(第7-10行)?但是输入样例只给了6行?实际上输入样例中给出了6行,但代码中需要10行输入(5行给小明,5行给小白:其中小白的第一行作为初始内容,然后4行写入)。但是输入样例中只提供了6行,说明样例输入是6行?不对,输入样例中提供了6行,但是实际程序运行需要10行(5+5)?注意看输入样例描述: 输入样例: 6月11日,今天复习了类和对象 6月12日,今天复习了继承#和多态 6月13日,明天要考试? 6月14日,今天要考Java#? 6月15日,昨天考的是Java? 6月11日,今天复习了类和对象 然后输出样例中还有4行输入?不对,实际上,在创建b的时候,读取了第6行(也就是最后一行的第一行)作为初始内容,然后循环4次读取,但是输入样例中已经没有了?所以输入样例中应该是10行?但是题目只给了6行。实际上,输入样例中给出了6行,但是程序运行需要10行,所以可能是样例输入有误?但题目描述中写明了输入样例。 重新分析Main中的输入: - 首先,创建小明的日记本,循环5次,每次读取一行:共读取5行(第1~5行) - 然后,创建小白的日记本,初始内容为scanner.nextLine(),这里会读取第6行(因为之前已经读取了5行,所以第6行被读作小白的初始内容) - 然后循环4次,读取4行(第7~10行) 但是输入样例中只给出了6行,所以后面4行没有给出?实际上,输入样例中给出了6行,但后面4行和前面的重复?输出样例显示小明的日记有5行,小白的日记也有5行(初始1行+4行)。所以输入样例应该是10行?但是题目输入样例部分只写了6行。再看题目中的输入样例和输出样例,输出样例中显示两本日记的内容都是5行,而且内容相同。 实际上,输入样例中给出了6行,然后输出样例中显示两本日记的内容都是: 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? 注意:在输入时,第2行和第4行包含了'#',所以写入时会抛出异常,并且只写入'#'之前的部分,然后添加换行符。所以: 小明的日记本: 第一行:6月11日,今天复习了类和对象(正常写入) 第二行:6月12日,今天复习了继承(因为遇到#抛出异常,所以写入到“继承”就停止了,然后添加换行符,所以这一行是“6月12日,今天复习了继承”+换行) 第三行:6月13日,明天要考试?(正常写入) 第四行:6月14日,今天要考Java(同样遇到#异常,所以只写入到“Java”,然后换行) 第五行:6月15日,昨天考的是Java?(正常写入) 小白的日记本: 初始内容:第6行“6月11日,今天复习了类和对象”+换行(因为构造时加了换行符) 然后写入4行: 第7行:6月12日,今天复习了继承(注意,这里没有#,因为输入样例中第7行是“6月12日,今天复习了继承”,没有#) 第8行:6月13日,明天要考试? 第9行:6月14日,今天要考Java 第10行:6月15日,昨天考的是Java? 但是输入样例中只给出了6行,那么第7~10行从哪里来?实际上,输入样例中只给了6行,所以程序运行到读取第7行时会阻塞等待输入。但是题目输出样例显示两本日记内容相同,所以我们可以假设输入样例中给出的6行后面还有4行(即第7~10行分别和前面的第2行(去掉#的部分)、第3行、第4行(去掉#的部分)、第5行相同)?但是输入样例中并没有给出。所以题目中的输入样例应该理解为: 第1行:6月11日,今天复习了类和对象 第2行:6月12日,今天复习了继承#和多态 第3行:6月13日,明天要考试? 第4行:6月14日,今天要考Java#? 第5行:6月15日,昨天考的是Java? 第6行:6月11日,今天复习了类和对象 (这是小白的初始内容) 第7行:6月12日,今天复习了继承 (注意,这里没有#) 第8行:6月13日,明天要考试? 第9行:6月14日,今天要考Java 第10行:6月15日,昨天考的是Java? 因此,输入样例应该为10行,但题目只列出了6行?实际上,题目输入样例部分只写了6行,但是输出样例显示了两本日记的完整内容,而且相同。所以,我们按照题目要求填空即可。 根据以上分析,完成填空。 </think>### 日记本系统实现 以下是完整的代码实现,按照题目要求填空完成: ```java import java.util.Scanner; class DiaryBook { private String author; private String content; public DiaryBook(String author) { this.author = author; this.content = ""; } public DiaryBook(String author, String content) { this.author = author; this.content = content; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public void write(char c) { if(c != '#') { content += c; } else { throw new IllegalArgumentException("日记中不能出现#号!"); } } public void write(String newContent) { try { for (int i = 0; i < newContent.length(); i++) { write(newContent.charAt(i)); } } catch (IllegalArgumentException e) { System.out.println("出现异常:" + e.getMessage()); } finally { content += "\n"; } } @Override public boolean equals(Object obj) { if(obj instanceof DiaryBook) { return content.equals(((DiaryBook)obj).content); } else { return false; } } @Override public String toString() { return author + "的日记:\n" + content; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); DiaryBook a = new DiaryBook("小明"); for(int i = 0; i < 5; i++){ a.write(scanner.nextLine()); } System.out.println(a); DiaryBook b = new DiaryBook("小白", scanner.nextLine() + "\n"); for(int i = 0; i < 4; i++){ b.write(scanner.nextLine()); } System.out.println(b); if(a.equals(b)){ System.out.println("两本日记完全相同"); } else { System.out.println("两本日记不同"); } } } ``` ### 代码解释: 1. **DiaryBook类**: - 两个构造方法:一个初始化空内容,一个初始化指定内容 - `write(char c)`方法:检查字符是否为'#',是则抛出异常,否则添加到内容 - `write(String newContent)`方法: ```java try { // 逐个字符写入 for (int i = 0; i < newContent.length(); i++) { write(newContent.charAt(i)); // 调用字符写入方法 } } catch (IllegalArgumentException e) { // 捕获异常并打印 System.out.println("出现异常:" + e.getMessage()); } finally { // 无论是否异常都添加换行 content += "\n"; } ``` - `equals()`方法:检查对象是否为DiaryBook实例并比较内容 - `toString()`方法:返回作者和日记内容的格式化字符串 2. **Main类**: - 创建小明的日记本(初始为空),写入5行 - 创建小白的日记本(初始为第1行),写入4行 - 比较两个日记本内容是否相同 ### 关键设计点: 1. **异常处理机制**: - 使用`IllegalArgumentException`处理非法字符输入 - `try-catch-finally`确保无论是否异常都添加换行符 - 异常发生时终止当前字符串的写入,但继续后续操作 2. **内容写入逻辑**: - 字符级过滤确保内容不含'#' - 每个字符串写入后自动添加换行符 - 异常时打印错误但程序继续执行 3. **对象比较**: - 重写`equals()`方法实现内容比较 - 使用`instanceof`检查对象类型 - 内容完全一致才判定为相同 ### 示例运行分析: **输入**: ``` 6月11日,今天复习了类和对象 6月12日,今天复习了继承#和多态 6月13日,明天要考试? 6月14日,今天要考Java#? 6月15日,昨天考的是Java? 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? ``` **处理过程**: 1. 小明日记写入: - 第1行:正常写入 - 第2行:遇到'#'抛出异常,写入"6月12日,今天复习了继承"后停止 - 第3行:正常写入 - 第4行:遇到'#'抛出异常,写入"6月14日,今天要考Java"后停止 - 第5行:正常写入 2. 小白日记创建: - 初始内容:"6月11日,今天复习了类和对象\n" - 写入4行正常内容 **输出**: ``` 出现异常:日记中不能出现#号! 出现异常:日记中不能出现#号! 小明的日记: 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? 小白的日记: 6月11日,今天复习了类和对象 6月12日,今天复习了继承 6月13日,明天要考试? 6月14日,今天要考Java 6月15日,昨天考的是Java? 两本日记完全相同 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值