Это кажется неверным.argv [1] - это ваша строка "day", длина которой составляет 1 или 2 символа, а вы индексируете символы 3 и 4.
char monstr[3];
monstr[0]= argv [1][3];
monstr[1]=argv [1][4];
monstr[2] = '\0';
Вероятно, это должно быть:
char monstr[3];
monstr[0]= argv [2][0];
monstr[1]=argv [2][1];
monstr[2] = '\0';
То же самое с некоторыми другими строками.
Но, тем не менее, я основываю это на том, как вы, кажется, анализируете ввод.Если вы хотите, чтобы ваш ввод был дд-мм-гггг, значит, вы не правильно вводите данные.Вместо этого вы должны сделать что-то вроде этого:
int dd, mm, yyyy;
sscanf(argv[1], "%d-%d-%d", &dd, &mm, &yyyy);
И то же самое с другой строкой.И в этом случае предыдущую вещь, которую я исправил, не нужно исправлять.
Как общий совет: причина ошибок сегментации заключается в том, что вы обращаетесь к памяти, которую вы не можетедоступ.Распространенной причиной этого является выход за пределы массива или использование недопустимых указателей.В вашем случае, это похоже на один из этих двух, и это происходит из-за неправильного использования argv.