2月9日 C Primer Plus学习
11.3 字符串输出
C有3个标准库函数用于打印字符串:put()、fputs()和printf()。
11.3.1 puts()函数
puts()函数很容易使用,只需把字符串的地址作为参数传递给它即可。
程序清单11.12演示了puts()的一些用法。
程序清单11.12 put_out.c程序
/* put_out.c -- 使用 puts() */
#include <stdio.h>
#define DEF "I am a #defined 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 #defined string.
An array was initialized to me.
A pointer was initialized to me.
ray was initialized to me.
inter was initialized to me.
如上所示,每个字符串独占一行,因为puts()在显示字符串时会自动在其末尾添加一个换行符。
该程序示例再次说明,用双引号括起来的内容是字符串常量,且被视为该字符串的地址。
另外,储存字符串的数组名也被看作是地址。在第5个puts()调用中,表达式&str1[5]是str1数组的第6个元素(r),puts()从该元素开始输出。
与此类似,第6个puts()调用中,str2+4指向储存"pointer"中i的存储单元,puts()从这里开始输出。
puts()如何知道在何处停止?该函数在遇到空字符时就停止输出,所以必须确保有空字符。
11.3.2 fputs()函数
fputs()函数是puts()针对文件定制的版本。它们的区别如下。
fputs()函数的第 2 个参数指明要写入数据的文件。如果要打印在显示器上,可以用定义在stdio.h中的stdout(标准输出)作为该参数。
与puts()不同,fputs()不会在输出的末尾添加换行符。
注意,gets()丢弃输入中的换行符,但是puts()在输出中添加换行符。
另一方面,fgets()保留输入中的换行符,fputs()不在输出中添加换行符。假设要编写一个循环,读取一行输入,另起一行打印出该输入。
如果gets()读到文件结尾会返回空指针。对空指针求值为0(即为假),这样便可结束循环。
如果混合使用 fgets()输入和puts() 输出,每个待显示的字符串末尾就会有两个换行符。
这里关键要注意: puts()应与gets()配对使用,fputs()应与fgets()配对使用。
并不鼓励使用gets(),而是为了了解它的用法。如果今后遇到包含该函数的代码,不至于看不懂。
11.3.3 printf()函数
和puts()一样,printf() 也把字符串的地址作为参数。printf()函数用起来没有puts()函数那么方便,但是它更加多才多艺,因为它可以格式化不同的数据类型。
与puts()不同的是,printf()不会自动在每个字符串末尾加上一个换行符。因此,必须在参数中指明应该在哪里使用换行符。
printf()的形式更复杂些,需要输入更多代码,而且计算机执行的时间也更长(但是你觉察不到)。然而,使用 printf()打印多个字符串更加简单。
编程练习3
代码
#include<stdio.h>
#define LEN 80
char * getWord(char *out)
{
char input[LEN];
char *in = input;
puts("输入一行输入:");
fgets(input, LEN, stdin);
while((*in == '\n' || *in == '\t' || *in == ' ') && *in != '\0')
in++;
while(*in != '\n' && *in != '\t' && *in != ' ' && *in != '\0')
*out++ = *in++;
return out;
}
void main(void)
{
char output[LEN];
getWord(output);
printf("你输入的第一个单词是:%s", output);//题目中定义的单词是没有空白、制表符或换行符的字符序列
return;
}
运行结果:

输入的内容是随手打的,可能有点那啥
编程练习4
代码
#include<stdio.h>
#define LEN 80
char * getWord(char *out, int length)
{
char input[LEN];
char *in = input;
int i = 0;
puts("输入一行输入:");
fgets(input, LEN, stdin);
while((*in == '\n' || *in == '\t' || *in == ' ') && *in != '\0')
in++;
while(*in != '\n' && *in != '\t' && *in != ' ' && *in != '\0' && i < length)
{
*out++ = *in++;
i++;
}
return out;
}
void main(void)
{
char output[LEN];
getWord(output, LEN);
printf("你输入的第一个单词是:%s", output);
return;
}

还是随手打的,凑齐80个字符
浙公网安备 33010602011771号