1. scanf() 和 printf()
scanf() 和 printf() 函数日常使用较多,此处不多介绍了。详细内容可参考:https://zh.cppreference.com/w/c/io/fscanf。
2. sscanf() 和 sprintf()
sscanf() 可类比于 scanf() 函数。scanf() 从控制台读取格式化输入,传入到特定变量中。例如 scanf("%d", &a) 把控制台输入的内容传入到 a 中。而 sscanf() 函数从字符串读取格式化输入,传到特定的变量中。10-5(https://blog.csdn.net/gltzlike/article/details/119559880)中利用 sscanf() 获取 ".123" 中的 123。
// int sscanf(const char *str, const char *format, ...)
void TestSscanf(){
char *src = "12.123";
int a;
int b;
sscanf(src, "%2d.%3d", &a, &b);
printf("a: %d\n", a); // a: 12
printf("b: %d\n", b); // b: 123
}
sprintf() 函数发送格式化输出到指定的 str 字符串。此处将 str 看作 dest,其他内容为 src。sprintf() 函数本质便是将 src 内容复制到 dest 的指定位置,默认情况下从 0 位置开始。且一旦从 0 位置开始复制,会清空原有的 dest。10-4 小节也使用过此函数:https://blog.csdn.net/gltzlike/article/details/119548128
// int sprintf(char *str, const char *format, ...)
void TestSprintf(){
char *dest = "hello";
char *src = "hi";
sprintf(dest, "%s", src); // hi
puts(dest);
dest = "hello";
sprintf(dest + 1, "%s", src); // hhi
puts(dest);
dest = "hello";
sprintf(dest + 5, "%s", src); // hellohi
puts(dest);
}
3. vscanf() 和 vprintf()
vprintf() 和 变长参数 va_list 配合使用,可以输出多个参数,也可用来改造 printf() 函数。5-5 节中 PRINTLNF 函数:https://blog.csdn.net/gltzlike/article/details/114380186。
#include <stdarg.h>
void TestVprintf(char *format, ...){
va_list args; // 1. 获取第二个参数里所有的变量
va_start(args, format); // 2. 每个变量对应自己的格式
vprintf(format, args); // 3. 打印各变量,类比于 printf() 函数
va_end(args);
}
int main() {
TestVprintf("%d, %s\n", 2, "arguments"); // 2, arguments
return 0;
}
vscanf() 函数和 vprintf() 函数用法相同,所以应该也可以用来改造 scanf() 函数。除此之外,与 scanf() 函数完全一致。
void TestVscanf(char *format, ...){
va_list args; // 1. 获取第二个参数里所有的变量
va_start(args, format); // 2. 每个变量对应自己的格式
vscanf(format, args);
va_end(args);
}
int main() {
int a;
char b[4];
TestVscanf("%d %s", &a, b); // b最多输入三个字符
TestVprintf("a: %d\nb: %s", a, b);
// printf("a: %d\nb: %s", a, b);
return 0;
}