C Primer Plus 第11章 字符串和字符串函数 11.3 字符串输出

假如想象 提交于 2019-11-29 03:45:34

11.3.1  puts( )函数

puts( )函数的使用很简单,只需要给出字符串参数的地址。程序清单11.8列出了输出字符串的多种方式。

程序清单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中的程序。

/*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( )的面向文件版本。两者之间的区别是:

1、fputs()需要第二个参数来说明要写的文件。可以使用stdout作为参数来进行输出显示,stdout在stdio.h中定义。

2、与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) ; 。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!