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

从二维char数组读取整数与字符串异常:字符串赋值失败求助

问题分析与解决

核心问题点

  1. strtok破坏原行结构
    你在fgets读取每行后调用了strtok(data[line],d);,这个操作会直接修改原字符串:把第一个分隔符(若d为空格)替换成\0,导致原行被截断成(1,2),后续的apple 2 3 north全部丢失,sscanf自然读不到后面的字符串。而且代码里d变量未定义,本身就是语法错误。

  2. 变量名拼写不一致
    你定义的字符串变量是deriction[20],但sscanf里写的是direction,变量名不匹配直接导致字符串赋值失败。

  3. fgets携带的换行符干扰解析
    fgets会把换行符\n也读入数组,可能影响sscanf对最后一个字符串的匹配逻辑。

修正后的代码

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

#define MAX_LINES 100
#define MAX_LEN 100

int main() {
    const char* fileName = "test.txt";
    FILE *in_file = fopen(fileName,"r");
    char data[MAX_LINES][MAX_LEN];
    int x,y,age,hun;
    char type[10];
    char direction[20]; // 修正拼写错误
    if(! in_file){
        printf("cannot read file\n");
        exit(1);
    }
    int line=0;
    while(line < MAX_LINES - 1){ // 避免数组越界
        if(fgets(data[line],MAX_LEN,in_file) == NULL ){
            break;
        }
        // 去掉换行符,消除解析干扰
        data[line][strcspn(data[line], "\n")] = '\0';
        line++;
    }
    fclose(in_file);
    for(int i = 9; i<14 && i < line;i++){ // 防止访问未初始化的空行
        // 用返回值判断解析是否成功,正常应返回6(对应6个变量)
        int ret = sscanf(data[i],"(%d,%d) %8s %d %d %8s",&x,&y,type,&age,&hun,direction);
        if(ret == 6){
            printf("解析成功:x=%d,y=%d,type=%s,age=%d,hun=%d,direction=%s\n",x,y,type,age,hun,direction);
        } else {
            printf("第%d行解析失败,成功读取%d个变量\n",i,ret);
        }
    }
    return 0;
}

额外注意事项

  • 读取行时限制line < MAX_LINES -1,避免二维数组越界。
  • 解析循环里增加i < line判断,防止访问未读取的空行。
  • 利用sscanf的返回值调试,能快速定位哪部分解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:10:33