Sscanf Sprintf
从您已经掌握的 scanf
和 printf
的知识出发,理解 sscanf
和 sprintf
就非常容易了,因为它们在格式控制方面是完全一致的。主要的区别在于它们操作的对象不同:scanf
和 printf
主要用于标准输入输出(键盘和控制台),而 sscanf
和 sprintf
则是用于字符串的操作.
您可以将 sscanf
和 sprintf
看作是 scanf
和 printf
的“字符串版本”。
1. scanf
到 sscanf
的过渡
-
您已经知道
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. printf
到 sprintf
的过渡
-
您已经知道
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
中使用的格式控制字符串在语法和功能上是相同的.
总结:
sscanf
和scanf
的核心区别在于数据来源:sscanf
从字符串读取,scanf
从标准输入读取。它们的格式控制字符串是相同的。sprintf
和printf
的核心区别在于数据去向:sprintf
写入字符串,printf
输出到标准输出。它们的格式控制字符串是相同的。
因此,您在 scanf
和 printf
中学习到的关于数据类型格式符(如 %d
, %f
, %c
, %s
, %o
, %x
等)、宽度控制、精度控制等知识,都可以直接应用到 sscanf
和 sprintf
中。这使得从 scanf
/printf
过渡到 sscanf
/sprintf
非常自然和简单。