11.3.1 puts( )函数数组
puts( )函数的使用很简单,只须要给出字符串参数的地址。程序清单11.8列出了输出字符串的多种方式。ide
程序清单11.8 put_out.c程序函数
/*put_out.c 使用puts( )函数*/ #include<stdio.h> #define DEF "I am a #define string." int main(void) { char str1[80]="An array was initialized to me."; const char * str2 ="A pointer was initialized to me."; puts("I'm an argument to puts( ). "); puts(DEF); puts(str1); puts(str2); puts(&str1[5]); puts(str2+4); return 0; }
输出以下:设计
I'm an argument to puts( ). I am a #define string. An array was initialized to me. A pointer was initialized to me. ray was initialized to me. inter was initialized to me.
注意,每一个字符串都单行显示。与printf()不一样,puts()显示字符串时,自动在其后面过添加一个换行符。指针
这个例子,让人想起双引号中的字符是字符串常量,并被看做地址。一样,字符数组字符串的名字也被看做是地址。表达式&str1[5]是数组str1的第6个元素的地址。这个元素包含字母‘r’,它也正是puts()输出字符串的起点。与之相似,str2+4指向包含'i'的那个内存单元。puts()如何知道什么时候中止?遇到空字符它就会停下来,因此应该确保有空字符存在。不要效仿程序清单11.9中的程序。code
/*nono.c 不要效仿这个程序*/ #include<stdio.h> int main(void) { char side_a[]='SIDE A'; char dont[]={'w','o','w','!'}; char side_b[]='SIDE B'; puts(dont); return 0; }
dont缺乏一个表示结束的空字符,因它它不是一个字符串,这样puts()就不知道应该到哪里中止。它只是一直输出内存中dount后面的字符,直到发现一个空字符。内存
11.3.2 fputs( ) 函数字符串
fputs( )是puts( )的面向文件版本。二者之间的区别是:get
一、fputs()须要第二个参数来讲明要写的文件。可使用stdout做为参数来进行输出显示,stdout在stdio.h中定义。string
二、与puts()不一样,fputs()并不为输出自动添加换行符。
注意,gets()丢掉输入时里的换行符,可是puts()为输出添加换行符。另外一方面,fgets()存储输入中的换行符,而fputs()也不为输出添加换行符。假定写一个循环,读取一行并把它回显在下一行,能够这么写:
char line [81]; while(gets(line)) puts(line);
回忆一下,若是遇到文件结尾,gets()就返回空指针。空指针的值为0(也即假),这样就结束了循环。或者也能够这么作:
char line [81]; while(fgets(line,81,stdin)) fputs(line,stdout);
在第一个循环中,line数组中的字符串被显示在单独的一行上,这是因为puts()为它添加了一个换行符。第二个循环,line数组中的字符串一样被显示在单独的一行上,这是因为fgets()存储了一个换行符。注意,若是把fgets()和puts()输出结合使用,每一个字符串后就会显示两个换行符。关键在于,puts()是为和gets()一块儿使用而设计的,而fputs()是为和fgets()一块儿使用而设计的。
11.3.3 printf()函数
printf( )函数使用起来没有puts()那么方便,可是它能够格式化多种数据类型,于是更通用。
它位的区别 之一就是printf()并不自动在新行上输出每个字符串。相反,您必须指明须要另起一行的地方。所以:printf("%s\n",string) ; 与下面的语句效果同样puts(string) 。
正如您所见,第一种形式须要键入更多的代码,此外计算机须要的执行时间更长。不过,printf()使在一行上输出多个字符串变得更为简单。例如:printf("well, %s, %s\n",name,MSG) ; 。