#c
#c
Вопрос:
Привет, моя домашняя работа на c — создать планировщик, но он работает не так, как я хочу
#include <stdio.h>
#include <stdlib.h>
struct schedule{
char date[12];
char time[6];
int importance;
char name[128];
char content[128];
};
void showSchedule(struct schedule *sch, unsigned long long num){
int i;
for(i = 0; i < num; i ){
int j;
for(j = 0; j < 12; j ){
printf("%c",(sch i)->date[j]);
if(j==3||j==5||j==7){
printf(".");
}
}
for(j = 0; j < 6; j ){
printf("%c",(sch i)->time[j]);
if(j==1) printf(":");
}
printf("%d ",(sch)->importance);
printf("%s ",(sch)->name);
printf("%sn",(sch)->content);
}
}
int main(){
unsigned long long num;
scanf("%ull",amp;num);
struct schedule *sch;
sch = (struct schedule *)malloc(num * sizeof(struct schedule));
int i;
for(i = 0; i < num; i ){
scanf("%s",(sch i)->date);
scanf("%s",(sch i)->time);
scanf("%d",amp;(sch i)->importance);
scanf("%s",(sch i)->name);
scanf("%s",(sch i)->content);
}
showSchedule(sch, num);
free(sch);
return 0;
}
Это код, но мне нужно ввести количество номеров расписания, а затем ‘Дата (ггггММдд) Время (ЧЧЧМ) Важно, чтобы заголовок содержал’ в этом формате.
например, если я введу
2
20170302 0900 8 classes listentoclasses
20170303 1330 7 tasks Codingtask
после завершения выполнения кода вывод должен быть
2017.03.02. 09:00 8 classes listentoclasses
2017.03.03. 13:30 7 tasks Codingtask
Но когда я запускаю скрипт
2017.03.02.
09:00 S8 classes listentoclasses
2017.03.03. gra13:30 e8 classes listentoclasses
Я получаю этот вывод
Могу ли я получить какую-либо помощь?
Комментарии:
1. Похоже, вы упускаете
i
из виду это и следующие два:printf("%d ",(sch)->importance);
2. Если предполагается, что вы пишете программу на C , зачем вы пишете код на C?
3. Не забудьте проверить код возврата от
scanf
, чтобы убедиться, что вы получили все токены, которые вы просили..4. @1201ProgramAlarm Этот код является допустимым (я имею в виду компилируемый) кодом на C . Это будет правильный ответ после исправления ошибок. Я не знаю, будет ли оценка низкой за то, что вы не используете специфические функции C .
5. я удалил свой плохой ответ, лол. Но, короче говоря, когда вы сталкиваетесь с датами, предпочтительнее использовать более стандартные инструменты, чем просто char[12] , например, Boost::date . Это поможет вам убедиться, что дата действительно действительна (35.77.2020 не является действительной датой), а также очень поможет с форматированием. Смотрите, например, здесь , как можно выполнить ввод-вывод даты.
Ответ №1:
- Вы вызываете неопределенное поведение, передавая
scanf()
данные с неправильным типом в строкеscanf("%ull",amp;num);
:%u
ожидаетunsigned int*
, ноamp;num
естьunsigned long long
. Вы должны использовать%llu
вместо%ull
. - Вы выполняете слишком много итераций для печати даты и времени и вызываете неопределенное поведение, используя значения, выделенные через
malloc()
и неинициализированные, которые являются неопределенными. - Вы забыли напечатать пробелы между датой и временем, а также временем и важностью.
- Вы повторно печатаете
importance
name
иcontent
первого элемента. - Некоторые строки в функции
showSchedule
имеют неправильный отступ.
Ваша showSchedule
функция должна быть:
void showSchedule(struct schedule *sch, unsigned long long num){
int i;
for(i = 0; i < num; i ){
int j;
for(j = 0; j < 8; j ){
printf("%c",(sch i)->date[j]);
if(j==3||j==5||j==7){
printf(".");
}
}
printf(" ");
for(j = 0; j < 4; j ){
printf("%c",(sch i)->time[j]);
if(j==1) printf(":");
}
printf(" %d ",(sch i)->importance);
printf("%s ",(sch i)->name);
printf("%sn",(sch i)->content);
}
}
Комментарии:
1.
(sch i)->...
Нормальноi
, когда естьnum-1
?2. Кроме того, странно, что
num
может бытьlong long int
, ноi
это просто anint
, есть ли у нас опасность переполнения и возникновения UB?3. @FantasticMrFox
(sch i)->...
— это нормально, когдаi
этоnum-1
потомуsch
, что в данном случае это указатель наnum
массив элементов. Я согласен, что сочетаниеunsigned long long num
иint i;
является странным. Использованиеsize_t
для них обоих должно быть лучше.%zu
должен использоваться для считыванияsize_t
значения.