[英]Program crashes when trying to scan a string
我無法從包含任意游戲結果的.dat文件中掃描數據(用於測試程序)
結果的格式如下:(#表示分數為整數)
team_a#team_b#team_a#team_b#team_a#team_b#。 。 。 team_a#team_b#
每行是一個不同的游戲。
目前,我正在嘗試使用代碼執行的操作是使用fgets()函數掃描每個游戲/行,然后使用sscanf_s()函數從每一行獲取數據(好像我知道方式一樣) (已格式化)並將其存儲到我定義的數據結構中。
如果有更簡單,更快速和/或更可靠(萬無一失)的方法,我很樂意就應該將數據放入結構中的更改提出建議。
任何幫助是極大的贊賞。
Microsoft的安全sscanf_s
解釋格式說明符和參數的方式略有不同:為了防止緩沖區溢出,每種字符串格式( %s
, %c
和%[
)都必須在緩沖區之后傳遞相應的緩沖區大小。
因此,您的掃描命令應顯示為:
sscanf_s(data_file_line[i],
"%s %d %s %d",
game_results[i].first_team_name,
sizeof(game_results[i].first_team_name),
&game_results[i].first_team_score,
game_results[i].second_team_name,
sizeof(game_results[i].second_team_name),
&game_results[i].second_team_score);
您的代碼還有其他一些問題:
sscanf_s
的返回值,以便知道該行已成功解析。 返回值是轉換后的項目數,因此在您的情況下應為4。還要注意, %s
掃描單詞和團隊名稱,例如“ Man Utd”和“ Stoke City”有兩個單詞,因此無法正確解析。 feof
構造會使您一次讀取文件。 foef
, foef
使用讀取函數的返回值。 例如,到達文件末尾時fgets
返回NULL
,因此可以將其用作循環條件: while (fgets(buf, sizeof(buf), f)) ...
i
是否溢出。 如果您的文件太長, i
可能不夠大。 我簡化了一點,效果很好。 您的工作尚未完成。 請嘗試一下
#include <usual.h>
#define MAX_NAME_CHARS 15
#define MAX_DATA_FILE_LINE_LENGTH 32
#define MAX_GAME_RESULTS 128
int main( void )
{
FILE *inp2b;
typedef struct game_results
{
char first_team_name[MAX_NAME_CHARS];
int first_team_score;
char second_team_name[MAX_NAME_CHARS];
int second_team_score;
} game_results_t;
game_results_t game_results[MAX_GAME_RESULTS];
char data_file_line[MAX_DATA_FILE_LINE_LENGTH][MAX_DATA_FILE_LINE_LENGTH];
int errorcode = 0;
int i = 0;
//errorcode = fopen_s(&inp2b,"C:\\Users\\Cody\\Documents\\Visual Studio 2012\\DATAFILES FOR PA2\\input2b.dat","r");
inp2b = fopen( "C:\\testdat\\input2b.dat", "r" );
if ( inp2b == NULL )
errorcode = 1;
if ( errorcode != 0 )
{
printf( "Error opening 2nd data file!\n\n" );
return ( 0 );
}
else
{
printf( "\n\n\nFile was opened successfully!\n\n" );
}
i = 0;
while ( !feof( inp2b ) )
{
fgets( data_file_line[i], MAX_DATA_FILE_LINE_LENGTH, inp2b );
puts( data_file_line[i] );
printf( "\n" );
// sscanf_s(data_file_line[i],"%s %d %s %d",game_results[i].first_team_name,&game_results[i].first_team_score,game_results[i].second_team_name,&game_results[i].second_team_score);
sscanf( data_file_line[i], "%s %d %s %d", game_results[i].first_team_name,
&game_results[i].first_team_score,
game_results[i].second_team_name,
&game_results[i].second_team_score );
printf( "\n\n %s %d %s %d \n\n", game_results[i].first_team_name,
game_results[i].first_team_score,
game_results[i].second_team_name,
game_results[i].second_team_score );
i++;
}
fclose( inp2b );
return ( 0 );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.