编译工具:Code::Blocks
编译器: GNN GCC Compiler
#include <stdio.h> main() { int c; while((c = getchar())!= EOF) { putchar(c); printf("1"); } }
命令窗口红色区域1—Cstudy为输入,按下回车之后执行,红色区域2.....为输出;
/*****getchar和putchar分别是一次读/写一个字符的函数,getchar()函数等待输入直到按回车才结束******/
问题:回车算是一个字符么
a. 换行输出表明putchar()函数首次运行的时候执行了换行的操作,在后续的执行过程中并未再次换行;
b.在读/写完毕"Cstudy"最后一个字符y之后,while循环并未中断,而是令起一行,执行循环语句;
解释:1、回车算作一个输入字符,被读/写;
解释:2、Other reason;
c.如果回车不被当做一个输入字符
解释:1、Cstudy之后隐式存在一字符
PS:输入Cstudy以字符串的形式存在某缓存区中,并以类似于'\0'(字符串结束符)的形式结尾,编译器将之理解为空字符
d.在假定C正确的基础上,回车相当于“事件”,是编译器的原因还是getchar() or putchar()函数的原因
解释:不明;
解释:
1、根据Cstudy的读/写操作,确定a假设是正确的
2、针对回车是否被看做字符输入,尝试运行程序,直接回车,下图是程序执行结果
直接回车之后,程序仅打印一个回车符,表明回车并未做为一个输入字符被getchar()读取??
3、新问题出现,图一中看到最后换行打印的“1”该如何解释,在“Cstudy”之后是否存在某些隐式字符!!??
补充:1、我们应该搞清楚字符常量与仅包含一个字符的字符串之间的区别;'x'与"x“是不同的,前者是一个整数,其值是字母x在机器字符集中对应的数值(内部表示值);后者是一个包含一个字符(即字母x)以及一个结束符'\0'的字符数组;
2、其他数据类型,比如int数组,是不存在结束符的概念的;
3、内存中字符是连续存储的,如果不加结束符,程序无法判定某字符串长度;这可能会导至某些不可预见的问题,例如下面示例:
#include <stdio.h> main() { char data[5] = {'a','b','c','d','e'}; char c; char time[10]; sprintf(time,"%s",data); printf("%s",time); }
定义了字符数组data,如果初始化分配空间足够,运行时候会自动在字符数组末尾添加'\0',而在这里仅为'a','b','c','d','e'分配了空间5,没有为结束符'\0'预留空间,程序运行出现”乱码“,如图所示,将data[5]改成data[6],则显示正常。
4、字符常量一般用于与其他字符进行比较,但也可以像其他整数一样参与数值运算;