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;
}