sizeof操作符,它以字节为单位给出数据大小。strlen()函数以字符为单位给出字符串的长度。
因为一个字符只占用一个字节,所以可能认为这两个操作会得到相同的结果,事实并非如此。
见程序praise2.c
创建常量的三种方式: #define const 枚举。
深入了解一下printf和scanf。
它们称为转换函数更加准确。
键盘输入的是文本,当你输入整数2004时,实际上键入的字符为2 、 0、 0、 4 。那么程序就必须能把这个字符串逐个字符的转换成数值,这就是scanf的工作。printf恰好相反,它把各种数值转换成文本显示在屏幕上。
scanf函数每次读取一个文本单词,依照说明进行转换,并跳过单词之间的空格。如果第一个单词就不匹配,scanf就会停在那里,结束。下一次再读取,还会从这个位置开始。
scanf函数返回成功读入的个数。
比如scanf(“%d %s”, &num, name); 第一个单词会被转换成十进制整数,第二个被转换成字符串。都成功了,返回值为2.
传统上,c语言习惯用int类型作为标志,但是新型的_BOOL型更符合需求,通过包含stdbool.h头文件,可以用bool代替关键字_BOOL,并用true和false代替1和0.
仅仅处理字符的函数:
getchar,putchar
ch =getchar() 与 scanf(“%c”,&ch)等价。 putchar(ch) 与 printf(“%c”, ch)等价。
用来处理字符,它们更简洁。
配合ctype.h头文件提供的字符系列函数,能做不少事情。
逻辑运算符
&& , ||, !
与, 或 , 非
这些符号是使用美式键盘打印出的,而在世界各地,不是所有的键盘都有与美式键盘相同的符号。
为了解决这个问题,c99提供了iso646.h头文件,包含它,可以用 and ,or, not 代替。
i/o可分为
1. 非缓冲的: 输入内容对程序立即可用。——取决于计算机系统,缺乏可移植性
2. 缓冲的: 键入的字符被存储在缓冲区中,按下回车键该缓冲区中的内容才对程序可用。——ANSI 标准规定都要缓冲。
当然,非缓冲与缓冲各有它们的用途。
文件结尾:EOF
从键盘模拟文件结尾的方法: ibm pc及其兼容机 ctrl+z , unix 使用 ctrl+d
重定向的概念:
令程序与文件一同工作有两种方式。
Ⅰ: 明确的打开文件,读文件,写文件,关闭文件。
Ⅱ: 把数据流重新分配,让它关联到文件。我们后面的读写按照标准的i/o进行,而不关心数据流是从何处获取的。
第二种称为重定向技术。比起第一种方法在一些方面功能有限,但更容易使用。
最大的问题在于,重定向是由操作系统管理实现,而不是c语言,所以无法移植,且不同的操作系统有不同的实现方式。
unix及linux的输入重定向运算符 < ,数据流本来应该来自键盘,使用 程序 < text后,数据流读取text文本文件。
输出重定向 > , 数据流本来应该显示到屏幕,使用 程序 > text后,数据流被写入text文本文件。
必须对c语言处理输入的工作方式有一个清晰的理解: 表面上看去输入的是各种字符,字符串,数字等等,实际上是一个一个的字节流,包括肉眼不容易注意的空格字符,以及根本看不出来的回车换行,制表字符。
输入的确认可能是代码中最复杂的部分,因为要预见程序可能遇到的用户错误行为,并进行适当处理。
ubuntu中输入汉字,scanf利用字符串也可以保存,一个汉字占3个字节。
总结: 处理混合输入用scanf,单字符的getchar,文本行的gets,文件用fgets
处理混合输出用printf, 单字符的putchar, 文本行的puts,文件用fputs
特别sprintf也是处理混合输出,但不是显示在屏幕,而是写进字符串里——把数值转成字符串。
stdlib.h提供了atoi, atof ,atol——把字符串转成数值。(功能上scanf也可以,但需要键盘输入)
为了处理字符串,c语言提供了string.h众多函数;为了处理单字符,c语言提供了ctype.h众多函数。