不一定有数字,可能是纯文字,只是模仿printf函数
时间: 2024-11-06 12:21:49 浏览: 10
理解你的需求,如果你想创建一个类似printf的功能,但输入不仅仅是数字,也可以包含纯文字,你可以设计一个名为`VCP_print`的函数,它接受一个字符串格式和任意类型的参数,然后尝试解析格式并将其转换为合适的字符串形式。这样的函数不会像真正的printf那样做完整的类型检测和格式转换,而是简单地按照给定的模式输出。下面是一个基础版本的实现示例:
```c
void VCP_print(const char* format, ...) {
va_list args;
char buffer[100]; // 假设最多能处理100个字符的输出
int i;
// 初始化va_list
va_start(args, format);
// 解析格式字符串
for (i = 0; format[i]; ++i) {
if (format[i] == '%') {
switch (format[i + 1]) { // 目前仅支持 %s 和 %c 这样的基本格式
case 's':
if (va_arg(args, const char*)) {
strncpy(buffer + i, va_arg(args, const char*), sizeof(buffer) - i - 1);
buffer[sizeof(buffer) - i - 1] = '\0'; // 添加结尾的 null 字符
} else {
buffer[i++] = '%'; // 如果没有提供字符串,保留原始百分号
}
break;
case 'c':
if (va_arg(args, int)) {
buffer[i++] = va_arg(args, int); // 直接打印字符
} else {
buffer[i++] = '%'; // 如果没有提供字符,保留原始百分号
}
break;
default:
buffer[i++] = '%'; // 对于未知格式,直接保留百分号
break;
}
i += 2; // 跳过已解析的部分
} else {
buffer[i] = format[i];
}
}
buffer[i] = '\0'; // 结束字符串
// 发送到串口
CDC_Transmit_FS(buffer, strlen(buffer));
// 清理va_list
va_end(args);
}
```
使用该函数的方式如下:
```c
VCP_print("This is a test message: %s and %c.\n", "example", 'a');
```
阅读全文