1、sscanf 的基本使用
sscanf
函数用于从字符串中读取格式化的输入。在循环中使用 sscanf
时,可以反复调用它,从字符串中提取值,直到字符串被读取完毕。
1)解析整数和浮点数
#include <stdio.h> int main() { char str[] = "123 456.78"; // 输入字符串 int intValue; float floatValue; // 使用 sscanf 从字符串中解析整数和浮点数 int result = sscanf(str, "%d %f", &intValue, &floatValue); // 输出解析结果 if (result == 2) { printf("整数: %d\n", intValue); printf("浮点数: %.2f\n", floatValue); } else { printf("解析失败\n"); } return 0; }
2)解析多个数据类型
#include <stdio.h> int main() { char str[] = "Alice 30 5.9"; // 输入字符串 char name[20]; int age; float height; // 使用 sscanf 从字符串中解析多个数据 int result = sscanf(str, "%s %d %f", name, &age, &height); // 输出解析结果 if (result == 3) { printf("姓名: %s\n", name); printf("年龄: %d\n", age); printf("身高: %.1f\n", height); } else { printf("解析失败\n"); } return 0; }
3)解析带有分隔符的字符串
#include <stdio.h> int main() { char str[] = "2023-01-25"; int year, month, day; // 使用 sscanf 解析日期 int result = sscanf(str, "%d-%d-%d", &year, &month, &day); // 输出解析结果 if (result == 3) { printf("年: %d\n", year); printf("月: %d\n", month); printf("日: %d\n", day); } else { printf("解析失败\n"); } return 0; }
2、循环遍历字符串
使用 sscanf
时,要确保在每次调用后更新字符串指针,以便 sscanf
可以读取下一个部分。这是通过传递字符串指针并在每次调用后修改它来实现的。
#include <stdio.h> int main() { const char *str = "10 20 30 40 50"; int num; const char *ptr = str; while (sscanf(ptr, "%d", &num) == 1) { printf("读取的数字: %d\n", num); // 移动指针到字符串中的下一个数字 while (*ptr != ' ' && *ptr != '\0') { ptr++; } // 跳过数字之间的空格 while (*ptr == ' ') { ptr++; } } return 0; }
3、使用 fgets 的替代方法
如从用户输入或文件中读取数据,可以将 fgets
和 sscanf
结合使用,先读取整行数据,再使用 sscanf
在循环中解析它。
#include <stdio.h> int main() { char line[100]; int num; printf("请输入数字: "); fgets(line, sizeof(line), stdin); // 读取输入的一行 char *ptr = line; while (sscanf(ptr, "%d", &num) == 1) { printf("读取的数字: %d\n", num); // 将指针移动到下一个数字 while (*ptr != ' ' && *ptr != '\0') { ptr++; } while (*ptr == ' ') { ptr++; } } return 0; }