簡體   English   中英

c fscanf 存儲字符串

[英]c fscanf storing strings

我正在使用 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+�

狀態:

state_num:1178

為什么它沒有正確地將數據存儲在類 char* 數組中? 有一些特定的代碼需要保留,比如第一個字符串值需要能夠保留空格,所以我添加了“[^|]”,但是一旦我這樣做了,它就開始輸入無意義的字符班級。 我已經廣泛研究了 fscanf 但找不到如何正確地做我想做的事情。 有人能幫我妥善組織一下,填補我似乎無法填補的知識空白嗎?

沒有格式說明符%[...]s 只有%[...] 刪除s ,因為它會導致fscanf函數在輸入中查找文字s

如前所述,您有指針數組,而不是字符數組。 這意味着例如state作為參數將衰減為指向其第一個元素的指針,該元素又是一個指針,並且它將具有char **類型,這對於%[%s格式都是不正確的。

指針數組問題也會導致調用printf時出現問題。

一個好的編譯器會警告不匹配的類型和格式說明符。 如果您不這樣做,請嘗試啟用更多警告(例如,將-Wall -Wextra與 GCC 或 Clang 一起使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM