从二维char数组读取整数与字符串异常:字符串赋值失败求助
问题分析与解决
核心问题点
strtok破坏原行结构
你在fgets读取每行后调用了strtok(data[line],d);,这个操作会直接修改原字符串:把第一个分隔符(若d为空格)替换成\0,导致原行被截断成(1,2),后续的apple 2 3 north全部丢失,sscanf自然读不到后面的字符串。而且代码里d变量未定义,本身就是语法错误。变量名拼写不一致
你定义的字符串变量是deriction[20],但sscanf里写的是direction,变量名不匹配直接导致字符串赋值失败。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
相关产品推荐
相关产品推荐

