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

C语言用strtok拆分txt人员信息后如何存入数组做条件筛选

解答

思路正确性判断

你的核心思路是可行的,属于结构化文本处理的常规实现逻辑,问题出在数组定义、文件读取逻辑和token存储的细节处理上。你原本定义的char imena[500]是单个字符串,只能存储1个名字,要存多个人的信息需要改成二维字符数组,比如char imena[100][20]表示最多存储100个名字,每个名字最长19个字符。

Token存入数组的实现逻辑

你原有代码还存在几个明显问题:

  • 仅读取了文件的第一行内容,没有循环读取所有行
  • strtok循环的终止条件写为||会导致token为空时仍继续执行,出现非法访问错误
  • 年龄是整型字段,需要用atoi()函数将分词得到的字符串转为整数类型

修改后的可运行参考代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 设定业务筛选条件,可根据需求修改
#define TARGET_CITY "Beijing"
#define MIN_AGE 18

int main()
{
    int count = 0; // 有效人员计数
    char info[100]; // 存储单条人员信息行
    // 定义二维数组存储多人员字段,最多支持100条人员信息
    char imena[100][20];     // 名字数组
    char prezimena[100][20];  // 姓氏数组
    int godine[100];      // 年龄数组
    char mesto[100][20];     // 城市数组

    FILE *pok = fopen("C:/Users/Trajkovici/Desktop/OsobeFajl.txt","r");
    if(pok == NULL)
    {
        printf("Greška prilikom otvaranja datoteke!");
        return 1;
    }

    // 循环读取文件所有行
    while(fgets(info, sizeof(info), pok) != NULL)
    {
        // 去掉行末的换行符
        info[strcspn(info, "\n")] = '\0';
        int field_idx = 0;
        char *token = strtok(info, " ");
        while(token != NULL && field_idx < 4)
        {
            switch(field_idx)
            {
                case 0: strcpy(imena[count], token); break;
                case 1: strcpy(prezimena[count], token); break;
                case 2: godine[count] = atoi(token); break;
                case 3: strcpy(mesto[count], token); break;
            }
            token = strtok(NULL, " ");
            field_idx++;
        }
        count++;
    }
    fclose(pok);

    // 筛选符合条件的人员
    printf("符合条件的人员列表:\n");
    for(int i=0; i<count; i++)
    {
        if(godine[i] > MIN_AGE && strcmp(mesto[i], TARGET_CITY) == 0)
        {
            printf("%s %s %d %s\n", imena[i], prezimena[i], godine[i], mesto[i]);
        }
    }

    return 0;
}

更优实现方式

如果不需要留存所有人员数据仅做单次筛选,不需要把所有字段存入数组,可以读一行处理一行,符合条件直接输出即可,能节省内存开销,适合大文件场景,甚至可以直接用sscanf替代strtok简化逻辑:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define TARGET_CITY "Beijing"
#define MIN_AGE 18

int main()
{
    char info[100];
    char fname[20], lname[20], city[20];
    int age;

    FILE *pok = fopen("C:/Users/Trajkovici/Desktop/OsobeFajl.txt","r");
    if(pok == NULL)
    {
        printf("打开文件失败!");
        return 1;
    }

    printf("符合条件的人员:\n");
    while(fgets(info, sizeof(info), pok) != NULL)
    {
        info[strcspn(info, "\n")] = '\0';
        if(sscanf(info, "%s %s %d %s", fname, lname, &age, city) == 4)
        {
            if(age > MIN_AGE && strcmp(city, TARGET_CITY) == 0)
            {
                printf("%s %s %d %s\n", fname, lname, age, city);
            }
        }
    }
    fclose(pok);
    return 0;
}

内容的提问来源于stack exchange,提问作者Boki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:27:02