You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:07:49