C

C 知识量:16 - 74 - 317

11.3 字符串输出><

puts()函数- 11.3.1 -

C有3个标准库函数用于打印字符串,分别是puts()、fputs()和printf()函数。

使用puts()函数时,只需要将字符串的地址作为参数转递给它即可,例如:

#include <stdio.h>
#define M "Hello pnotes.cn"

int main(void) {
    char str1[20] = "I am Jeff";
    char *str2 = "I like programming";
    puts(M);
    puts(str1);
    puts(str2);
    puts(&str1[2]);
    puts(str2 + 3);
    system("pause");
    return 0;
}

运行结果为:

Hello pnotes.cn
I am Jeff
I like programming
am Jeff
ike programming

puts()函数在完成打印后会自动添加一个换行符。以上运行结果表明:

  • 用双引号括起来的内容是字符串常量,而且被视为该字符串的地址。

  • 存储字符串的数组名被视为地址。&str1[2]表示从数组str1的第3个元素开始打印。

  • str2+3表示指向该字符串的第4个存储单元,并从此处开始打印字符串。

注意:puts()函数在遇到空字符的时候才会停止打印,因此,必须确保打印内容有空字符。

fputs()函数- 11.3.2 -

fputs()与puts()函数的区别如下:

  • fputs()函数的第2个参数指明要写入数据的文件,如果要打印在显示器上,应当用定义在stdio.h中的stdout(标准输出)作为参数。

  • fputs()函数不会在输出末尾添加换行符,而puts()函数会。

  • fputs()函数与fgets()函数配对使用,puts()函数与gets()函数配对使用。

注意:gets()函数丢弃输入中的换行符,而puts()函数在输出中添加换行符;fgets()函数保留输入中的换行符,而fputs()函数不在输出中添加换行符。因此,如果混合使用fgets()函数和puts()函数,每个待显示的字符串后面就会有两个换行符。

printf()函数- 11.3.3 -

与puts()函数一样,printf()函数也把字符串的地址作为参数,它可以格式化显示不同的数据类型,功能更加强大。

printf()函数不会自动在字符串末尾添加换行符,但可以在待打印内容中特定位置添加\n来打印换行符。例如以下两行代码效果相同:

printf("%s\n", string);
puts(string);

自定义输入/输出函数- 11.3.4 -

除了使用C库中的标准函数外,还可以在getchar()和putchar()函数基础上,创建自定义函数,以实现想要的功能。

以下示例是自定义输出函数print1(),功能类似puts()函数,但不添加换行符:

void print1(const char * s) {
    while (*s)
        putchar(*s++);
}

以上代码中,putchar()循环打印字符串s的每个字符,当s指向空字符时,*s的值是0,循环打印结束。注意:++的优先级比*要高,因此将先计算s++部分,再打印,但是后缀++表示先取当前值再自增。

可以在print1()函数基础上添加一个功能,例如返回打印的字符数量,示例如下:

int print2(const char * s) {
    int count = 0;
    while (*s) {
        putchar(*s++);
        count++;
    }
    putchar('\n');
    return (count);
}

综合应用print1()和print2函数编写一段代码:

#include <stdio.h>

void print1(const char * s);
int print2(const char * s);

int main(void) {
    print1("I am Jeff and");
    print1(" I like programming.\n");
    printf("There are %d characters in s.\n", print2("Goodbye!"));
    system("pause");
    return 0;
}

void print1(const char * s) {
    while (*s)
        putchar(*s++);
}

int print2(const char * s) {
    int count = 0;
    while (*s) {
        putchar(*s++);
        count++;
    }
    putchar('\n');
    return (count);
}

运行结果为:

I am Jeff and I like programming.
Goodbye!
There are 8 characters in s.

使用printf()打印print2()的返回值时,需要先执行print2(),因此结果先打印“Goodbye!”,再打印printf()字符串字面量部分。