Указатель на строку печати приводит к повреждению вывода в C - PullRequest
0 голосов
/ 26 мая 2018
#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

Я думаю, что некоторые указатели являются проблемой.В чем проблема?

1 Ответ

0 голосов
/ 26 мая 2018

Вы используете это

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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...