Создание планировщика на c

#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 это просто an int , есть ли у нас опасность переполнения и возникновения UB?

3. @FantasticMrFox (sch i)->... — это нормально, когда i это num-1 потому sch , что в данном случае это указатель на num массив элементов. Я согласен, что сочетание unsigned long long num и int i; является странным. Использование size_t для них обоих должно быть лучше. %zu должен использоваться для считывания size_t значения.