簡體   English   中英

嘗試掃描字符串時程序崩潰

[英]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構造會使您一次讀取文件。 foeffoef使用讀取函數的返回值。 例如,到達文件末尾時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.

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