不需要亲自把空字符插入name数组中。scanf在读取输入时会替你完成这项任务。也无须在字符串常量中包含一个空字符。
#include<stdio.h> #define PRAISE "What a super marvelous name!" int main (void) { char name[40]; printf("What's your name?\n"); scanf("%s", name); printf("Hello, %s. %s\n", name, PRAISE); return 0; }
当输入guang yang 的时候的运行结果如下:
scanf() 只读取了guang yang的名字guang。scanf() 开始读取输入以后,会在遇到的第一个空白字符空格(blank)、制表符(tab)或者换行符(newline)处停止读取。因此他在遇到guang 和yang之间的空格时就停止扫描。一般情况下,使用%s的scanf() 只会把一个单词而不是把整个句子作为字符串读入。C使用其他读取输入函数(如gets() )来处理一般的字符串。
“X”是字符串常量;属于派生类型(char数组),实际上由两个字符(‘X’和空格字符‘\0’)组成。
‘X’是字符常量;属于基本类型(char)。
sizeof运算符是以字节为单位给出数据的大小。
strlen()函数以字符为单位给出字符串的长度。
空字符‘\0’的存在只是告诉strlen()函数在哪儿停止计数。
#include <stdio.h> #include <string.h> int main(void) { char name[40]; scanf("%s", name); printf("%d\n", strlen(name)); printf("%d\n", sizeof(name)); printf("%d\n", sizeof("guangyang")); return 0; }
运行结果为:
还有一点,sizeof后面是否适用圆括号的问题:
sizeof后面是否使用圆括号取决于你是想获取一个类型的大小还是想获取某个具体量的大小。
圆括号对于类型是必需的,而对于具体量则是可选的。
也就是说,应该使用sizeof(char)或sizeof(float),但是可以使用sizeof name或sizeof 6.28.
不过,在所有情况下都使用圆括号更好,比如sizeof (6.18);
#define NAME value
#define 语句也可以用于定义字符和字符串常量。前者用单引号,后者用双引号。
#define BEEP '\a'
#define TEE 'T'
#define ESC '\033'
#define OOPS "Now you have done it! "
符号名后的所有内容都用来代替它;
格式化输出中的float:
#include<stdio.h> int main(void) { const double RENT = 3852.99; //以const 方法定义的只读变量 printf("*%f*\n", RENT); printf("*%e*\n", RENT); printf("*%4.2f*\n", RENT); printf("*%3.1f*\n", RENT); printf("*%10.3f*\n", RENT); printf("*%10.3e*\n", RENT); printf("*%+4.2f*\n", RENT); printf("*%010.2f*\n", RENT); return 0; }
用gcc编译的结果为:
例中以默认格式%f开始。在这种情况下有两个默认项目:字段宽度和小数点右边的数字的数目。第二个默认项目的值是6个数字,字段宽度就是容纳数字所用的空间。
接下来是%e的默认格式。它在小数点的左侧打印一个数字,在小数点的右侧打印打印6个数字。我们得到了一堆数字! 解决方法是指定小数点右边小数位的数目,上诉例子中接下来的4个示例就是这样做的。第四个和第六个示例对输出进行了四舍五入。
最后,+标志使得结果数字和它的代数符号一起打印,在这里该符号就是加号符号;0标志产生前导零以使结果填充整个字段。请注意,在说明符%010中第一个0是一个标志,剩余的数字(10)指定字段宽度。
#include <stdio.h> int main(void) { printf("%x %X %#x\n", 31, 31, 31); printf("**%d**% d**% d**\n", 42, 42, -42); printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); return 0; }
gcc运行结果为:
首先,lf等于13的十六进制数。x说明符输出lf,而X说明符输出lF。使用#标志使输出以0x开始。
第二行示范了如何在说明符中使用空格以在正值之前产生一个前导空格(在负值之前不产生前导空格)。这将使有效位相同的正值和负值以相同字段宽度打印输出,因此结果看起来会令人舒服一些。
第三行说明如何在整数格式中使用精度说明符(%5.3d)来产生足够的前导零以填满要求的最小数字位数(这里是3);而使用0标志将会用前导零填满整个字段宽度;最后,如果0标志和精度说明符同时出现,那么0标志就会被忽略。
#include<stdio.h> #define BLURB "Authentic imitation" int main(void) { printf("/%2s/\n", BLURB); printf("/%24s/\n", BLURB); printf("/%24.5s/\n", BLURB); printf("/%-24.5s/\n", BLURB); }
gcc运行结果为:
注意系统如何扩展字段以包含所有指定的字符。同时注意:精度说明符是如何限制所打印的字符的数目的。格式说明符中的.5告诉printf()只打印5个字符。另外,“-”修饰符使文本左对齐输出。