C语言:将ASCII十进制缓冲区转字符串/字符数组,实现CSV权限配置
解决CSV权限配置数据的解析与匹配问题
看起来你已经搞定了文件读取的第一步,接下来核心就是把缓冲区里的CSV格式数据拆分开、解析出来,再实现权限匹配的逻辑。我给你一步步拆解,再附上修正后的完整代码:
1. 获取缓冲区实际数据长度
你不用纠结“实际存储数据的大小”,因为fgets读取到的是以'\0'结尾的字符串,直接用strlen(buff)就能拿到有效数据的长度(如果数据末尾带换行符,可手动去掉:buff[strcspn(buff, "\n")] = '\0';)。
2. 分割CSV字段
CSV是逗号分隔格式,用C标准库的strtok函数就能轻松拆分每个字段。第一次调用strtok(buff, ", ")(注意逗号后可能有空格,所以分隔符包含空格)拿到第一个字段(euid),之后每次调用strtok(NULL, ", ")就能依次获取后面的权限名称。
3. 解析并匹配euid
别用字符串比较数字(容易因空格、格式问题出错),把第一个字段用atoi转换成整数,再和目标euid(比如1000)比较,这样更可靠。
4. 存储权限列表
你原来的newCaps是空数组,会导致内存越界,需要先初始化一个足够大的数组(或者用动态内存分配)来存储权限名称。
修正后的完整代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #define BUFFER_SIZE 1024 #define MAX_CAPS 10 // 定义最大支持的权限数量,可根据实际需求调整 int main(int argc, char *argv[]){ FILE *fp = fopen("csvtest.csv", "r"); if(!fp){ printf("Failed to open file\n"); return 1; // 文件打开失败直接退出,避免后续错误操作 } char buff[BUFFER_SIZE]; // 读取一行数据,同时判断是否读取成功 if(fgets(buff, BUFFER_SIZE, fp) == NULL){ printf("Failed to read file or file is empty\n"); fclose(fp); return 1; } fclose(fp); // 读取完成后及时关闭文件,避免资源泄漏 // 去掉换行符(如果存在) buff[strcspn(buff, "\n")] = '\0'; char *newCaps[MAX_CAPS]; int capCount = 0; // 分割第一个字段:euid char *token = strtok(buff, ", "); if(token == NULL){ printf("Invalid CSV format\n"); return 1; } int euid = atoi(token); // 匹配目标euid if(euid == 1000){ printf("This is the correct euid\n"); // 遍历后续的权限字段,存入数组 while((token = strtok(NULL, ", ")) != NULL && capCount < MAX_CAPS){ newCaps[capCount++] = strdup(token); // 复制字符串到数组,避免原缓冲区被覆盖 } } // 测试输出读取到的权限 printf("Got capabilities:\n"); for(int i=0; i<capCount; i++){ printf("- %s\n", newCaps[i]); free(newCaps[i]); // 记得释放strdup分配的内存,避免内存泄漏 } return 0; }
代码关键点说明
- 补充了文件操作的错误处理,避免空指针访问导致崩溃
- 用
strtok处理CSV字段,同时兼容逗号后的空格 - 用
atoi转换euid为整数,匹配逻辑更准确 - 用
strdup复制权限字符串,因为strtok返回的是原缓冲区指针,后续操作可能覆盖原数据 - 最后释放
strdup分配的内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者ldd12345
相关产品推荐
相关产品推荐

