#include <stdio.h>
#include <stdlib.h>
struct cal {
int date;
int time;
int importance;
char title[256];
char description[256];
};
int count;
void change_Cal (struct cal *calendar) {
for (long long int i = 0; i < count; i++) {
int year = 0, month = 0, day = 0;
year = calendar[i].date / 10000;
month = (calendar[i].date - 10000 * year) / 100;
day = calendar[i].date % 100;
printf("%04d.%02d.%02d. ", year, month, day);
int hour, min;
hour = calendar[i].time / 100;
min = calendar[i].time % 100;
printf("%02d:%02d %d %s %s\n",hour,min,calendar[i].importance, calendar[i].title, calendar[i].description);
}
}
int main() {
struct cal *calendar;
//struct cal calendar[1024] = { 0, };
printf("please input the number of the calender.\n>");
scanf("%d", &count);
calendar = (struct cal *)malloc(sizeof(struct cal)*count);
calendar = (struct cal *)calloc(count, sizeof(struct cal));
printf("input calendars.\n");
for (int i = 0; i < count; i++) {
printf(">");
scanf("%d %d %d %c %c", &calendar[i].date, &calendar[i].time, &calendar[i].importance, calendar[i].title, calendar[i].description);
printf("\n");
}
change_Cal(calendar);
}
的
printf("%02d:%02d %d %s %s\n",hour,min,calendar[i].importance, calendar[i].title, calendar[i].description);
部分无效。
一些数据也被破坏。
Input : 20180927 0900 0 iiii
Output: 2018.09.27. 09:00 0 i i
Process returned 0 (0x0) execution time : 12.588 s
我认为有些问题是问题所在。
有什么问题?
最佳答案
你用这个
scanf("%d %d %d %c %c", &calendar[i].date, &calendar[i].time, &calendar[i].importance, calendar[i].title, calendar[i].description);
读这个
20180927 0900 0 iiii
^ ^ ^ ^^
%d %d %d cc
这样就得到一个数字,一个数字,一个数字,一个字符('i')和一个字符('i')。
您是否注意到将数字与前导0和八进制数字混淆的风险?
两个预期字符之间的格式字符串中的空白将被解析为“采用任何当前空白”,对于“ iiii”而言,该空白为“无空白”。
您将留在输入流“ ii \ n”中;这会使下次扫描号码的尝试迷惑,并使号码失败。即下一次尝试扫描的返回值(在代码中将其忽略)将为0,而应为5。
要解决有关通过scanf进行复杂输入扫描可能会出错的所有问题的信息,请执行以下操作:
http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
然后更改为可以读取字符串而不是字符的内容,但可能无法读取scanf()的内容。