c - c fscanf 存储字符串
问题描述
我正在使用 fscanf 读取每行具有这种格式的文件:
//FEATURE_ID|FEATURE_NAME|FEATURE_CLASS|STATE_ALPHA|STATE_NUMERIC|COUNTY_NAME|COUNTY_NUMERIC|PRIMARY_LAT_DMS|PRIM_LONG_DMS|PRIM_LAT_DEC|PRIM_LONG_DEC|SOURCE_LAT_DMS|SOURCE_LONG_DMS|SOURCE_LAT_DEC|SOURCE_LONG_DEC|ELEV_IN_M|ELEV_IN_FT|MAP_NAME|DATE_CREATED|DATE_EDITED
这是文件的第一行,例如:
//913064|Oso Spring|Spring|NM|35|Rio Arriba|039|365418N|1061159W|36.904945|-106.1998199|||||2863|9393|Bighorn Peak|12/01/1991|04/19/2011
我的代码是这样的:
int id, state_num, county_num, elev_m, elev_f;
float lat_dec, lon_dec;
char* name[25];
char* class[25];
char* state[25];
char* county[25];
char* lat[25];
char* lon[25];
char* s_lat_dms[25];
char* s_lon_dms[25];
char* s_lat_dec[25];
char* s_lon_dec[25];
char* map_name[25];
char* date_created[25];
char* date_edited[25];
fscanf(data, "%d|%[^|]s|%s|%s|%d|%s|%d|%s|%s|%f|%f|%s|%s|%s|%s|%d|%d|%s|%s|%s", &id, name,
class, state, &state_num, county, &county_num, lat, lon, &lat_dec,
&lon_dec, s_lat_dms, s_lon_dms, s_lat_dec, s_lon_dec, &elev_m, &elev_f, map_name,
date_created, date_edited);
printf("id:%d \nname:%s \nclass:%s \nstate:%s \nstate_num:%d \n", id, name, class, state,
state_num);
但是当我在命令行上运行它时,它会打印出这个:
编号:913064
名称:奥索泉
类:�&6+�</p>
状态:
state_num:1178
为什么它不能在类 char* 数组中正确存储数据?有一些特定的代码需要保留,比如第一个字符串值需要能够保留空格,所以我添加了“[^|]”,但是一旦我这样做了,它就开始输入无意义的字符班级。我已经广泛研究了 fscanf 但找不到如何正确地做我想做的事情。有人可以帮我正确组织这个,并填补我似乎无法填补的知识漏洞吗?
解决方案
没有格式说明符%[...]s
。只有%[...]
. 删除s
, 因为它会导致fscanf
函数在输入中查找文字s
。
如前所述,您有指针数组,而不是字符数组。这意味着例如state
作为参数将衰减为指向其第一个元素的指针,而该指针又是一个指针,并且它将具有对于 the和格式char **
都不正确的类型。%[
%s
数组指针问题也会导致调用时出现问题printf
。
一个好的编译器会警告不匹配的类型和格式说明符。如果您没有,请尝试启用更多警告(例如-Wall -Wextra
使用 GCC 或 Clang)。
推荐阅读
- java - 一个外键用于相同类型的多个关系休眠
- vscode-extensions - 单击查看容器后执行操作
- python - Python unittest - 在同一测试中显示所有 AssertionError
- geometry - 具有最小平均绝对偏差的凸抛物线支持点?
- firebase - jetified-protobuf-javalite-3.14.0 com.google.protobuf:protobuf-javalite:3.14.0) jetified-protobuf-lite-3.0.1 (com.google.protobuf:protobuf-lite:3.0.1
- ruby-on-rails - Rubymine command + click 显示 Rails 方法,但不是 ruby 方法。是否可以在 Rails 应用程序中命令 + 单击 Ruby 方法?
- javascript - 我的js可以访问浏览器anc的唯一ID吗?
- javascript - 显示无 CSS 规则在删除时禁用 JS 代码
- google-app-engine - 映射到安全站点的 Google App Engine 自定义域
- javascript - React - 需要帮助将路径转换为字符串,以便用户在单击 img 时被重定向到 Stripe