手写一个sscanf函数
时间: 2024-08-16 09:03:53 浏览: 36
手写一个`sscanf`函数是一个有趣的学习过程,它模拟了标准库函数的功能,用于从字符串中按照指定的格式读取数据。这是一个简单的版本,仅实现了基本的整数和浮点数的解析:
```c
#include <stdio.h>
#include <stdarg.h>
int my_sscanf(const char *str, const char *format, ...) {
va_list args;
int i = 0;
int total_matched = 0;
// 初始化va_list
va_start(args, format);
while (format[i]) {
if (format[i] == '%') {
switch (format[++i]) {
case 'd':
if (isdigit(str[total_matched])) {
total_matched += scanf("%d", &va_arg(args, int));
}
break;
case 'f':
if (isdigit(str[total_matched]) || str[total_matched] == '.') {
total_matched += sscanf(str + total_matched, "%f", &va_arg(args, float));
}
break;
// 更多的格式说明符可以添加,如's' for 字符串等
default:
fprintf(stderr, "Unsupported format specifier: %c\n", format[i]);
return -1; // 格式错误
}
} else {
if (str[total_matched++] != format[i])
return -1; // 数据类型不符或结束标志未到达
}
}
// 检查是否已完全匹配
if (total_matched != strlen(format))
return -1;
va_end(args);
return total_matched;
}
// 示例用法
int main() {
char input[] = "123.45 678 hello";
int num1, num2;
float fnum;
if (my_sscanf(input, "%d%f %d", &num1, &fnum, &num2) == 3) {
printf("num1: %d, fnum: %.2f, num2: %d\n", num1, fnum, num2);
} else {
printf("Invalid format.\n");
}
return 0;
}