Sscanf Sprintf

Sscanf Sprintf

从您已经掌握的 scanfprintf 的知识出发,理解 sscanfsprintf 就非常容易了,因为它们在格式控制方面是完全一致的。主要的区别在于它们操作的对象不同:scanfprintf 主要用于标准输入输出(键盘和控制台),而 sscanfsprintf 则是用于字符串的操作.

您可以将 sscanfsprintf 看作是 scanfprintf 的“字符串版本”。

1. scanfsscanf 的过渡

  • 您已经知道 scanf 函数用于从标准输入(通常是键盘)读取数据,并根据指定的格式控制字符串将这些数据存储到提供的变量的地址中。例如:

    int num;
    scanf("%d", &num); // 从键盘读取一个整数并存储到 num 的地址
    

    这里的 %d 就是格式控制字符串的一部分,表示读取一个十进制整数.

  • sscanf 函数与之类似,但它不是从标准输入读取数据,而是从一个已知的字符串中读取数据。它的函数原型通常是这样的:

    int sscanf(const char *str, const char *format, ...);
    • str:指向要读取数据的字符串
    • format格式控制字符串,与 scanf 中的格式控制字符串完全相同。它指定了如何解析字符串中的数据。
    • ...:要存储读取到的数据的变量的地址,与 scanf 相同。

    例如,如果您有一个字符串 "123 45.6 abc",您可以使用 sscanf 从这个字符串中提取整数和浮点数:

    char str[] = "123 45.6 abc";
    int num;
    float f;
    sscanf(str, "%d %f", &num, &f); // 从字符串 str 中读取一个整数和一个浮点数
    // num 的值将是 123,f 的值将是 45.6
    

    可以看到,sscanf 的格式控制字符串 "%d %f" 与您在 scanf 中使用的格式控制字符串是相同的.

2. printfsprintf 的过渡

  • 您已经知道 printf 函数用于将数据格式化输出到标准输出(通常是控制台),它使用格式控制字符串来指定数据的输出格式。例如:

    int num = 10;
    printf("The number is %d\n", num); // 将 "The number is 10\n" 输出到控制台
    

    这里的 %d 同样是格式控制字符串的一部分,表示以带符号十进制数形式输出整数.

  • sprintf 函数与之类似,但它不是将格式化后的数据输出到控制台,而是将格式化后的数据写入到一个字符串缓冲区中。它的函数原型通常是这样的:

    int sprintf(char *str, const char *format, ...);
    • str:指向要写入格式化数据的字符数组(字符串缓冲区)
    • format格式控制字符串,与 printf 中的格式控制字符串完全相同。它指定了如何格式化输出数据。
    • ...:要格式化输出的变量的值,与 printf 相同。

    例如,如果您想将一个整数和一个浮点数格式化到一个字符串中,您可以使用 sprintf:

    int num = 123;
    float f = 45.67;
    char buffer[50];
    sprintf(buffer, "Number: %d, Float: %.2f", num, f);
    // buffer 中将存储字符串 "Number: 123, Float: 45.67"
    cout<<buffer<<endl;

    同样,sprintf 的格式控制字符串 "Number: %d, Float: %.2f" 与您在 printf 中使用的格式控制字符串在语法和功能上是相同的.

总结:

  • sscanfscanf核心区别在于数据来源sscanf 从字符串读取,scanf 从标准输入读取。它们的格式控制字符串是相同的
  • sprintfprintf核心区别在于数据去向sprintf 写入字符串,printf 输出到标准输出。它们的格式控制字符串是相同的

因此,您在 scanfprintf 中学习到的关于数据类型格式符(如 %d, %f, %c, %s, %o, %x 等)宽度控制精度控制等知识,都可以直接应用sscanfsprintf 中。这使得从 scanf/printf 过渡到 sscanf/sprintf 非常自然和简单。