2. 字符串的输入输出

这节课我们来学习 C 语言中字符的输入输出操作。

在任何的编程语言中,字符串的输入输出都是常用的功能。我们先来学习字符串的输出。

1、字符串的输出

字符串的输出需要给出字符串的起始地址,然后将起始地址之内的所有字节的内容以文字的形式输出到控制台终端中,当遇到零值的字符时结束输出。常用于输出的标准库函数有 printfputs,下面是它们的参数和用法说明。

函数
说明
备注
int printf(const char * format, ...);
格式化输出,占位符是 %s
需要手动添加换行符 \n
int puts(const char *s);
输出一行单行的字符串
自动添加换行符 \n

以上两个函数都在头文件 stdio.h 中声明。

示例:

// filename: string_output.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    const char *website = "weimingze.com";
    char buf[100] = "hello world!";

    printf("website: %s\n", website);
    puts(website);
    printf("buf: %s\n", buf);
    puts(buf);

    return 0;
}

运行结果如下:

weimingze@mzstudio:~$ gcc -o string_output string_output.c
weimingze@mzstudio:~$ ./string_output
website: weimingze.com
weimingze.com
buf: hello world!
hello world!

2、字符串的输入

字符串的输出需要先声明一个能够存放该字符串的缓冲区(Buffer),然后将缓冲区的起始地址交给相应的输入函数。完成输入。常用于字符串输入的标准库函数有 scanffgets,下面是它们的参数和用法说明。

函数
说明
备注
int scanf(const char * format, ...);
格式化输入,占位符是 %s
遇到空格等空白字符则会断开输入,并在读入数据后追加尾零 '\0'
char *fgets(char *s, int size, FILE * stream);
读取一行字符串放入缓冲区 s,最多读入 size 个字符,将标准输入 stdin 放入 stream 参数
遇到换行符 \n 或内容超过 size 长度则结束输入并自动追加尾零 '\0'

以上两个函数都在头文件 stdio.h 中声明。

示例:

// filename: string_input.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    char buf1[100];
    char buf2[100];
    char buf3[100];
    char buf4[100];

    printf("请输入空格分隔的两个字符串: ");
    scanf("%s", buf1);
    scanf("%s", buf2);

    printf("请输入一行文字:");
    fgets(buf3, sizeof(buf3), stdin);  // stdin 是标准输入,默认为键盘

    printf("请输入一行文字:");
    fgets(buf4, sizeof(buf4), stdin);

    printf("buf1: %s\n", buf1);
    printf("buf2: %s\n", buf2);
    printf("buf3: %s\n", buf3);
    printf("buf4: %s\n", buf4);

    return 0;
}

运行结果如下

weimingze@mzstudio:~$ gcc -o string_input string_input.c
weimingze@mzstudio:~$ ./string_input
请输入空格分隔的两个字符串: hello world!
请输入一行文字:请输入一行文字:hello china!
buf1: hello
buf2: world!
buf3:

buf4: hello china!

weimingze@mzstudio:~$

运行结果说明:

  1. 在提示 请输入空格分隔的两个字符串: 后输入 hello world! 并回车,实际输入给程序的字符为 "hello world!\n"
  2. 这一行 scanf("%s", buf1); 是将 "hello" 交给缓存区 buf1, buf1 的内容为 hello\0,刚才输入的内容剩余 " world!\n"
  3. 这一行 scanf("%s", buf2);"world!" 交给缓存区 buf2, buf2 的内容为 world!\0,刚才输入的内容还剩余一个换行符 "\n"
  4. 这一行 printf("请输入一行文字:"); 执行,打印 请输入一行文字:
  5. 这一行 fgets(buf3, sizeof(buf3), stdin); 执行,将输入缓冲区内的"\n" 交给缓存区 buf3, buf3 的内容为 \n\0,刚才输入的内容经过上述两个 scanf 和一个 fgets 全部读走。此时输入缓冲区为空。
  6. 这一行 printf("请输入一行文字:"); 执行,打印 请输入一行文字:并连接在上一行之后。
  7. 这一行 fgets(buf3, sizeof(buf3), stdin); 执行,输入 hello china! 后并回车,实际将输入为 "hello china!\n" 交给 buf4,并在后面追加尾零。

练习: