• ベストアンサー

このソースがコンパイルエラーになってしまいます

このソースのどこがわるいのかわかりません エラー時にこのようなエラーメッセージが出ます In function `writedata': 52: error: syntax error before string constant 65: error: syntax error before string constant 89:2: warning: no newline at end of file ソースはこれです #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writedata(char datafile[]); void viewdata(char datafile[]); char datadir[] = "dat/"; int year,month,day; int main(int argc,char *argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile,"walk%04d%02d",year,month); if((argc > 1) && (strcmp(argv[1],"-view")==0)) { viewdata(datafile); } else { writedata(datafile); } return 0; } void writedata(char datafile[]) { diary today_data; FILE *outfp; char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか?(y/n) > ",year,month,day); scanf("%c", &y_n); while(getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ",year,month,day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str"%d %d %d",&year,&month,&day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31)|| (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile,"walk%04d%02d",year,month); } today_data.day = day; printf("距離は? >"); scanf("%lf", &today_data.dist); while(getchar() != '\n') { } printf"コメントは?(30文字以内) >"); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s",datadir,datafile); if((outfp = fopen(filename,"a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp , "%d %.2lf", today_data.day,today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp,"%s",today_data.comment); fclose(outfp); printf("記録しました"); } void viewdata(char datafile[]) { } なぜ、エラーになったか教えてくださいお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

ぱっと見のコードで気になっただけなので全部見てません コンパイルエラーにはなりませんが >char datadir[] = "dat/"; char datadir[] = "dat//"; じゃないと動かないと思います(ファイルオープンエラーになると思われます) ただ / はバックスラッシュのつもりでしょうか? 環境が分かりませんが / がバックスラッシュの代わりになる環境ならいいですが 普通はコードが異なります

その他の回答 (1)

noname#111181
noname#111181
回答No.1

エラー箇所と訂正例は以下の通りです。 -------------------------------- 52行目: × sscanf(input_str"%d %d %d",&year,&month,&day); ○ sscanf(input_str", %d %d %d",&year,&month,&day); 65行目: × printf"コメントは?(30文字以内) >"); ○ printf("コメントは?(30文字以内) >"); 89行目の最後に改行がない

関連するQ&A

  • C言語について

    #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writeData(char datafile[]); void viewData(char datafile[]); char datadir[] = "dat/"; int year, month, day; int main(int argc, char* argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile, "walk%04d%02d", year, month); if ((argc > 1) && (strcmp(argv[1], "-view")==0)) { viewData(datafile); } else { writeData(datafile); } return 0; } void writeData(char datafile[]) { diary today_data; FILE *outfp; //出力ファイルのファイルポインタ char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか? (y/n) > ", year , month, day); scanf("%c", &y_n); while (getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ", year, month, day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str, "%d %d %d", &year, &month, &day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31) || (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile, "walk%04d%02d.txt", year, month); } today_data.day = day; printf("距離は? > "); scanf("%lf", &today_data.dist); while (getchar() != '\n') { } printf("コメントは?(30文字以内) > "); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s", datadir, datafile); if((outfp = fopen(filename, "a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp, "%d %.2lf ", today_data.day, today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp, "%s", today_data.comment); fclose(outfp); printf("記録しました"); } void viewData(char datafile[]){ } このソースの char datadir[] = "dat/";この宣言はディレクトリを指しているんですよね? この場合の/はどおいう意味ですか? 教えてください

  • C言語のtime_tに関して

    こんにちは。 今現在、C言語にてプログラミングを行っております。time_tを用いましたが、4月などの2桁目が0のは巧く取得できたのですが、日にちの2桁目が0にならず、空白となってしまいます。 一応、ソースを載せておきますが見辛いのが申し訳ないです。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> time_t timer; struct tm *local; struct tm *utc; extern char today[20]; extern char today2[20]; extern char today_year[10]; extern char today_month[2]; extern char today_day[2]; void day(){ char *ptr; /* 現在時刻を取得 */ timer = time(NULL); local = localtime(&timer); /* 地方時に変換 */ /* 地方時 変換後表示 */ printf("地方時: "); printf("%4d/", local->tm_year + 1900); printf("%2d/", local->tm_mon + 1); printf("%2d ", local->tm_mday); if(local->tm_mday<10) //system("pause"); // printf("%2d:", local->tm_hour); // printf("%2d:", local->tm_min); // printf("%2d", local->tm_sec); // printf(" %d\n", local->tm_isdst); /*****************************/ sprintf(today_year,"%4d", local->tm_year + 1900); sprintf(today_month,"%2d", local->tm_mon + 1); sprintf(today_day,"%2d", local->tm_mday); if((local->tm_mon+1)<=9) today_month[0]='0'; if((local->tm_mday+1)<=9) today_day[0]='0'; sprintf(today, "%s-%s-%s", today_year, today_month, today_day); sprintf(today2, "%s/%s/%s", today_year, today_month, today_day); //printf("%s",today); /*****************************/ // utc = gmtime(&timer); /* 協定世界時(UTC)に変換 */ /* 協定世界時 変換後表示 */ // printf("\n\n\n\n協定世界時: "); // printf("%4d/", utc->tm_year + 1900); // printf("%2d/", utc->tm_mon + 1); // printf("%2d ", utc->tm_mday); // printf("%2d:", utc->tm_hour); // printf("%2d:", utc->tm_min); // printf("%2d", utc->tm_sec); // printf(" %d\n", utc->tm_isdst); return; } どなたかご教示下さい。

  • C++で日付のプログラミング

    前回も同じ質問をして、自分なりに直してみたのですが、どうもうまく動作しません。 長くなりますが、教えてください。 日付のエラー処理を完全にするというもので、 次のような仕様を満たすようにMyDateクラスを修正せよ。というものです。 1.月、日共に初期値は1とする。 2.月、日の状態を出力するメンバ関数print()を追加する。 3.changeDay関数において、monthに入っている値に対応して適切なエラー処理を行う。    4月の時は日は30まで、5月の時は31まで、みたいな感じです。 4.changeMonth関数において、変更しようとする月に対しdayに入っている値が大きすぎる場合、dayを変更後の最後の日に修正するようにする。例えば、5月31日に設定されている時に、changeMonth(2)が呼ばれた時、monthに2を、dayに28を代入する。 5.うるう年は考慮しなくていい。 #include <stdio.h> class MyDate{ private: int month, day; public: void Date(int, int); void changeMonth(int); //「月」変更用関数 void changeDay(int); //「日」変更用関数 void print(); }; void MyDate::Date(int argMonth,int argDay) { argMonth = 1; argDay = 1; } void MyDate::changeMonth(int argMonth)//メンバ関数(changeMonth)の定義 { if(argMonth >= 1 && argMonth <= 12){ //1~12のときだけ値を更新 month = argMonth; } } void MyDate::changeDay(int argDay)//メンバ関数(changeDay)の定義 { //1~31が入力された場合のみ値を更新 if(argDay >= 1 && argDay <= 31){ day = argDay; } if(month == 1,day > 31){ printf("DATE = %d/%d\n",1,31); }else if(month == 2,day > 28){ printf("DATE = %d/%d\n",2,28); }else if(month == 3,day > 31){ printf("DATE = %d/%d\n",3,31); }else if(month == 4,day > 30){ printf("DATE = %d/%d\n",4,30); }else if(month == 5,day > 31){ printf("DATE = %d/%d\n",5,31); }else if(month == 6,day > 30){ printf("DATE = %d/%d\n",6,30); }else if(month == 7,day > 31){ printf("DATE = %d/%d\n",7,31); }else if(month == 8,day > 31){ printf("DATE = %d/%d\n",8,31); }else if(month == 9,day > 30){ printf("DATE = %d/%d\n",9,30); }else if(month == 10,day > 31){ printf("DATE = %d/%d\n",10,31); }else if(month == 11,day > 30){ printf("DATE = %d/%d\n",11,30); }else if(month == 12,day > 31){ printf("DATE = %d/%d\n",12,31); }else{ printf("DATE = %d/%d\n",month,day); } } int main(int, char **){ MyDate today; today.changeMonth(12); today.changeDay(35); return 0; } それで、 初期化するコンストラクタなんですが、 void MyDate::Date~ のような感じでいいのでしょうか? argMonthとかargDayとかいらないですか?ただMonthとDayだけでいいでしょうか? print()のメンバ関数なんですが、条件式の中に組込むとメンバ関数がいらないんじゃないか、と思ってしまうのですが、条件式の最後のelse{~}の中身を入れればいいでしょうか? あと、today.changeMonth(12); today.changeDay(35); と入れると、12/-858993460とでてしまうのですが、 条件式が間違ってるんでしょうか? 質問が多くてすみません。 よろしければ、回答よろしくお願いします。

  • エラーがわかりません、、

    以下のプログラムを入力したときに以下のえらーがでます。 List13-4.c: In function ‘get_data’: List13-4.c:18: error: expected expression before ‘)’ token 18行目を探すのですが、自力では見つけられません。もしかしたら 別のところが間違っていて18行目がエラーと出ているのかなと思っています。ならいたてですぐにわかるようなミスかもしれないですが、よろしくお願いします。 #include <stdio.h> #include <time.h> char data_file[] = "datetime.data"; void get_data(void) { FILE *fp; if((fp = fopen(data_file,"r")) == NULL){ printf("本プログラムを実行するのは初めてですね\n"); } else{ int year,month,day,h,m,s; fscanf(fp,"%d %d %d %d %d %d",&year,&month,&day,&h,&m,&s); printf("前回は%d年%d月%d日%d時%d分%d秒でした\n",year,month,day,h,m,s,); fclose(fp); } } void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if((fp = fopen(data_file,"w")) == NULL) printf("\aファイルをオープンできません\n"); else{ fprintf(fp,"%d %d %d %d %d %d\n", local->tm_year + 1900,local->tm_mon + 1 ,local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); fclose(fp); } } int main(void) { get_data(); put_data(); return(0); }

  • カレンダー作成

    C言語初心者です。 西暦と月を入力してその月のカレンダーを作成するプログラムの問題なのですが #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < [A]; i++) {   mcnt += mday[i];  }  mcnt++;  [B] = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if ([C])    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if ([D]) {    printf("\n");    ycnt = 0;   }  }  return (0); } [A]、[B]、[C]、[D]に答えを入れなきゃいけないのですが私が考えた答えだと カレンダーの表示すらされません。どこがいけないのでしょうか? #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < month; i++) {   mcnt += mday[i];  }  mcnt++;  youbi = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if (youbi = 0)    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if (youbi > 7) {    printf("\n");    ycnt = 0;   }  }  return (0); } よろしくお願いします。

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • C言語で3次元配列を使い一年分のカレンダーを作成

    カレンダーは完成したのですが曜日がズレてしまい綺麗に表示されません。どのように改善すれば良いのでしょうか?よろしくお願いします。 現状です #pragma warning(disable:4996) #include <stdio.h> #include <Windows.h> enum M_LIST { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, N_MONTH }; enum W_LIST { SUN, MON, TUE, WED, THU, FRI, SAT, N_WEEK }; int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数 char *weekday[] = { "日","月","火","水","木","金","土" }; //各曜日 /*プロトタイプ宣言*/ int monthday(int year); void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]); void karenda(char box[N_MONTH][N_WEEK][N_WEEK]); /*メイン*/ void main(void) { int year, total; char box[N_MONTH][N_WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる /*画面制御の初期化*/ COORD coord; HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); printf("西暦を入力"); scanf("%d", &year); //年度の入力 total = monthday(year); Array(total, box); karenda(box); } /*求める月の前月までの総日数*/ int monthday(int year) { int total = 0; /*求める年の前年までの総日数を求める*/ total = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1); /*うるう年の判定*/ if (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0) { mday[FEB] = 29; } else { mday[FEB] = 28; } return total % 7; } /*カレンダーの配列*/ void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]) { int month, row, col, day; col = total; for (month = JAN; month < N_MONTH; month++) { row = 1; day = 1; while (day <= mday[month]) { box[month][row][col] = day; if (col > SAT) { //土曜までいったら次の週 row++; col = SUN; } day++; col++; } } } /*カレンダーの出力*/ void karenda(char box[N_MONTH][N_WEEK][N_WEEK]) { int month, week, day; for (month = JAN; month < N_MONTH; month++) { //月の出力 printf("%3d\n", month + 1); for (week = SUN; week < N_WEEK; week++) { for (day = SUN; day < N_WEEK; day++) { if (week == 0) { //曜日の出力 printf("%s", weekday[day]); } if (box[month][week][day] == 0) { //0なら空白 printf(" "); } else { printf("%3d", box[month][week][day]); } } printf("\n"); } printf("\n"); } } 今はこのような形で表示されます(空白は_で表しています) 日____月____火____水____木____金____土 ________1___2___3___4___5 6___7___8___9__10__11__12 13_14__15__16__17__18__19 20_21__22__23__24__25__26 27_28__29__30__31

  • エラー処理

    万年カレンダーを作っています。 while(1){ printf(" 西暦年>"); scanf("%d",&year); /*西暦年入力*/ printf("   月>"); scanf("%d",&month); /*月入力*/ if(year>0 && month>0 && month<13){     break; } else{ printf("正しく入力してください\n"); } 上記のように、数字のエラー処理をしたのですが、これに数字以外のモノが入力された場合のエラー処理も追加しなければなりません。

  • C言語の穴埋め問題なのですが

    ???の中身を教えてください #include <stdio.h> #define N 3 //構造体の宣言 typedef struct date{ char *nengou; int year; int month; int day; }DATE; //関数のプロトタイプ宣言 void disp(DATE data); int main(void) { DATE birthday; char buff[80]; ???= buff; printf("年号:"); scanf("%s" , birthday.nengou); printf("年:"); scanf("%d" ,&birthday.year ); printf("月:"); scanf("%d" , &birthday.month); printf("日:"); scanf("%d" ,&birthday.day ); disp(birthday ); } void disp(DATE data) { printf("%s%d年%d月%d日\n" , data.nengou , data.year , data.month , data.day); }

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

専門家に質問してみよう