我試圖在代碼中加入一個檢查來查看是否輸入了一個值。我的程序以(月日年)的格式對日期列表進行排序,當月份作爲字符輸入時。檢查輸入是否已經輸入到一個數組中
下面是應該發生的一個例子。
3 - 要排序的n個日期的數量。
,隨後在格式H日期(年月日)
01年1月1日
00年1月1日
99年2月28日
然後用戶檢查,如果日期已經被輸入格式爲(月日年)
最終輸出:
日期按時間順序排序
然後告訴用戶,如果他們做了檢查數據,他們 輸入(這就是我需要幫助)
這就是我試圖檢查一個值是否被輸入的方法。
int k;
int input[j];
scanf("%d", &input[j]);
for (i = 0; k < n; k++) {
if (ar[i] == input[j]) {
printf("Yes value is there");
}
else {
printf("No value isn't");
}
}
下面我發佈了我的工作程序,沒有嘗試執行檢查。運行這個只是返回按時間順序排序的日期。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* constants for max chars, max day, max year, max size */
enum { MAXC = 12,
MAX_DAY = 31,
MAX_YEAR = 12,
MAX_SIZE = 1000 };
typedef struct {
char month[MAXC]; /* either make static or allocate separately */
unsigned day;
unsigned year;
int monthnum;
} date;
/* empty character remaining in stdin */
void empty_stdin()
{
int c;
while ((c = getchar()) != '\n' && c != EOF) {
}
}
int fix_year(int year)
{
if (year >= 90)
return 1900 + year;
return 2000 + year;
}
/* sort struct date on year */
int sort(const void* a, const void* b)
{
date* date1 = (date*)a;
date* date2 = (date*)b;
/*if (date2->year != date1->year)
return (date1->year > date2->year) - (date1->year < date2->year);*/
int year1 = fix_year(date1->year);
int year2 = fix_year(date2->year);
//return year2 - year1;
//int month1 = date1->month;
//int month2 = date2->month;
if (date2->year != date1->year) {
return year2 - year1;
}
else if (date2->month != date1->month) {
int month1 = date1->month;
int month2 = date2->month;
return month2 - month1;
}
else if (date2->day != date1->day) {
//else sort day
int day1 = date1->month;
int day2 = date2->month;
/*int daycompare = date2->day - date1->day;
return -daycompare;
*/
return day2 - day1;
}
return 0;
}
/* output n elements of array of struct date */
void output(date* ar, int n)
{
int i;
printf("\nOutput sorted by year:\n\n");
for (i = 0; i < n; i++)
printf(" %s %d %d\n", ar[i].month, ar[i].day, ar[i].year);
}
int main(void)
{
int i, n;
date* ar = NULL;
while (1) { /* obtain valid 'n', compare with using fgets below */
int rtn; /* varaible to save return of scanf -- always validate */
//printf ("Enter number of dates to be entered (between 1 & 1000): ");
if ((rtn = scanf("%d", &n)) != 1) { /* if conversion failed */
if (rtn == EOF) { /* test for user cancelation of input */
fprintf(stderr, "note: user canceled input, exiting.\n");
return 0;
} /* otherwise simply an invalid input */
fprintf(stderr, "error: invalid input.\n");
goto tryagain;
}
if (n < 0) { /* invalid input < 0 */
fprintf(stderr, "error: invalid input (n < 0).\n");
goto tryagain;
}
if (n > MAX_SIZE) { /* invalid input > MAX_SIZE */
fprintf(stderr, "error: invalid input (n > %d).\n", MAX_SIZE);
goto tryagain;
}
break; /* if we are here - we have a good value, break */
tryagain:; /* label for goto to jump over break */
empty_stdin(); /* empty characters that remain in input buffer */
}
empty_stdin(); /* empty characters that remain in input buffer */
/* allocate array of struct ar, n elements */
if ((ar = malloc(sizeof *ar * n)) == NULL) {
fprintf(stderr, "error: virtual memory exhausted.\n");
return 1;
}
/* provide format instructions */
//printf ("Enter the date (month day year)\n"
// " format, e.g.: Jan 18 2017\n\n");
for (i = 0; i < n; i++) { /* loop until all elements filled */
char buf[MAX_DAY + 1] = "", ans[MAXC] = "";
//printf (" date[%2d] : ", i + 1); /* prompt for input */
/* if fgets return is NULL, EOF encountered */
if (fgets(buf, MAX_DAY + 1, stdin) == NULL) {
fprintf(stderr, "note: user canceled input, exiting.\n");
return 0;
}
if (*buf == '\n') { /* if first char is '\n', user just hit enter */
printf("no input provided, quit (y/n)? ");
if (fgets(ans, MAXC, stdin) && (*ans == 'y' || *ans == 'Y'))
return 0;
else if (!*ans) { /* if ans NULL, EOF encountered */
fprintf(stderr, "note: user canceled input, exiting.\n");
return 0;
}
}
/* parse with sscanf, validate 3 conversion took place */
if (sscanf(buf, "%11s %u %u", ar[i].month, &ar[i].day, &ar[i].year) != 3) {
fprintf(stderr, "error: invalid input.\n");
continue;
}
/* only increment if valid sscanf conversion took place */
}
//scanf("%d", &date_list[i].day);
qsort(ar, n, sizeof(date), sort); /* sort by year */
output(ar, n); /* output results */
free(ar); /* free ar - you allocate it, you free it */
return 0;
}
編寫返回月份爲數字的函數嗎?或者寫一個比較兩個月份名稱的函數? – kaylum
對不起,如果我的帖子有點混亂。我試圖編寫一個函數來檢查用戶是否輸入了一個日期到列表中。因爲在我的程序中使用月份的方式,我遇到了麻煩。 – LookingWest
'if(date2-> month!= date1-> month)'因爲'month'成員是一個字符串而錯誤。使用'strcmp'或比較'monthnum'。 –