プログラムの概要
c言語で、ファイルから読み取ったデータをもとにサーバーが動いているかどうかを確認するプログラムを作成しています。
読み取るファイル
20201019133124,10.20.30.1/16,2
20201019133125,10.20.30.2/16,1
20201019133134,192.168.1.1/24,10
20201019133135,192.168.1.2/24,5
20201019133224,10.20.30.1/16,522
20201019133225,10.20.30.2/16,1
20201019133234,192.168.1.1/24,8
20201019133235,192.168.1.2/24,15
20201019133324,10.20.30.1/16,-
20201019133325,10.20.30.2/16,2
20201019133334,10.20.30.1/16,-
20201019134040,10.20.30.1/16,5
20201019134440,10.20.30.1/16,-
20201019134450,10.20.30.1/16,5
20201019134460,192.168.1.1/24,-
20201019135050,192.168.1.2/24,15
左から<確認日時>,<サーバアドレス>,<応答結果>という並びになっています。
応答結果で-が返ってきた場合にサーバー故障とみなすようになっています。
発生している問題・エラーメッセージ
サーバー10.20.30.1/16が故障状態です 故障期間は1秒です サーバー10.20.30.1/16が故障状態です 故障期間は7分6秒です サーバー10.20.30.1/16が故障状態です 故障期間は10秒です サーバー192.168.1.1/24が故障状態です 故障期間は5分90秒です zsh: abort ./a.out
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define N 50 6 7struct LOG{ 8 long time; 9 char server_name[N]; 10 char result[N]; 11}; 12 13void printTime(long kikan){ 14 char kikan2[14]; 15 sprintf(kikan2,"%ld",kikan); 16 int len = strlen(kikan2); 17 long sec,min,hour,day,month,year; 18 year = kikan/10000000000; 19 month = (kikan/1000000)%100; 20 day = (kikan/10000)%100; 21 hour = (kikan/100)%100; 22 min = kikan/100; 23 sec = kikan%100; 24 25 26 if(len<=2){ 27 printf("故障期間は%ld秒です\n",sec); 28 }else if(len<=4){ 29 printf("故障期間は%ld分%ld秒です\n",min,sec); 30 }else if(len<=6){ 31 printf("故障期間は%ld時%ld分%ld秒です\n",hour,min,sec); 32 }else if(len<=8){ 33 printf("故障期間は%ld日%ld時%ld分%ld秒です\n",day,hour,min,sec); 34 }else if(len<=10){ 35 printf("故障期間は%ld月%ld日%ld時%ld分%ld秒です\n",month,day,hour,min,sec); 36 }else if(len<=14){ 37 printf("故障期間は%ld年%ld月%ld日%ld時%ld分%ld秒です\n",year,month,day,hour,min,sec); 38 } 39} 40 41 42 43int main(){ 44 FILE *fp; 45 struct LOG log[10]; 46 47 char s[N][N],*cp,handan_name[N]; 48 49 50 const char *sikiri=","; 51 long handan_time=0,kikan; 52 int i = 0,j = 0,len=0,ct=0; //ctによって一度のエラーにつき一回のみと判断 53 54 55 fp = fopen("server.txt","r"); 56 57 while(fgets(s[i],N,fp)!=NULL){ 58 cp = strtok(s[i],sikiri); 59 log[i].time=atol(cp);//ここで時間を挿入、文字列から数に変換 60 int c=0; 61 while(cp!=NULL){ 62 cp = strtok(NULL,sikiri); 63 if(cp!=NULL&&c==0){ 64 strcpy(log[i].server_name,cp); //ここでサーバーの名前を挿入 65 c++; 66 67 68 if(strcmp(&handan_name[len-1],"1")&& 69 strncmp(handan_name,log[i].server_name,8)==0&&ct==1){ //if(故障していたら)ここでサーバーの名前がかぶってないか判断 70 kikan=log[i].time-handan_time; 71 printTime(kikan); 72 ct--; 73 }else if(strcmp(&handan_name[len-1],"2")&& 74 strncmp(handan_name,log[i].server_name,9)==0&&ct==1){ 75 kikan=log[i].time-handan_time; 76 printTime(kikan); 77 ct--; 78 } 79 } 80 81 if(cp!=NULL&&c==1){ 82 strcpy(log[i].result,cp);//ここで結果を挿入 83 if(strncmp(log[i].result,"-",1)==0&&ct==0){ 84 printf("サーバー%sが故障状態です\n",log[i].server_name);//サーバーが故障しているか判断 85 len=strlen(log[i].server_name); 86 handan_time = log[i].time; 87 strcpy(handan_name,log[i].server_name); 88 ct++; 89 } 90 } 91 } 92 i++; 93 } 94 95 96 fclose(fp); 97 return 0; 98}
試したこと
自分なりに調べたところ、zsh: abort ./a.outというエラーはメモリ解放に関するエラーだということが書いてあったのですが、例は全てmallocでのメモリ確保が前提となっており、char *cpをmallocでメモリ確保しfreeしてみる、などを行いましたが何も変わりませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/11/19 02:27