C语言仅用scanf和fgets从文件提取指定数据的实现疑问
手动解析固定格式字符串提取数字
你说得对,scanf本来就是从标准输入(键盘)读取数据的,没法直接处理内存里的buffer字符串。既然不能用sscanf这类格式化解析库函数,那就只能手动遍历buffer,按照固定格式跳过不需要的内容,直接提取数字部分。
针对你给出的格式"test1 4, test25",可以按以下步骤实现:
- 先跳过固定前缀
"test1 ",找到第一个数字的位置; - 提取这个数字直到遇到逗号
',',存入str1; - 再跳过
", test2"这段固定内容,找到第二个数字的位置; - 提取剩余的数字字符存入
str2。
下面是具体的代码实现(假设已经用fgets把文件行读到buffer里):
#include <stdio.h> #include <string.h> int main() { char buffer[] = "test1 4, test25"; // 模拟fgets读取的行内容 char str1[5] = {0}; char str2[5] = {0}; char *ptr = buffer; // 跳过"test1 " ptr += strlen("test1 "); // 提取第一个数字到str1,直到遇到',' int i = 0; while (*ptr != ',' && *ptr != '\0') { if (i < 4) { // 留位置给字符串结束符 str1[i++] = *ptr; } ptr++; } str1[i] = '\0'; // 手动添加结束符 // 跳过", test2" ptr += strlen(", test2"); // 提取第二个数字到str2 i = 0; while (*ptr != '\0' && *ptr != '\n') { // 排除换行符 if (i < 4) { str2[i++] = *ptr; } ptr++; } str2[i] = '\0'; // 验证结果 printf("str1: %s\nstr2: %s\n", str1, str2); // 之后你可以手动把str1、str2转成整数 return 0; }
这种方法完全依赖固定的字符串格式,只要输入行的格式严格符合"test1 X, test2Y"(X、Y为数字),就能准确提取出对应的数字部分。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

