2017-03-20 167 views
-1

我試圖在代碼中加入一個檢查來查看是否輸入了一個值。我的程序以(月日年)的格式對日期列表進行排序,當月份作爲字符輸入時。檢查輸入是否已經輸入到一個數組中

下面是應該發生的一個例子。

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; 
} 
+0

編寫返回月份爲數字的函數嗎?或者寫一個比較兩個月份名稱的函數? – kaylum

+0

對不起,如果我的帖子有點混亂。我試圖編寫一個函數來檢查用戶是否輸入了一個日期到列表中。因爲在我的程序中使用月份的方式,我遇到了麻煩。 – LookingWest

+0

'if(date2-> month!= date1-> month)'因爲'month'成員是一個字符串而錯誤。使用'strcmp'或比較'monthnum'。 –

回答

0
int cday, cyear, cmonth, i; 
char smonth[MAXC]; 
scanf("%d %d %d",&month ,&day, &cyear); 
month_num_to_string(cmonth,smonth); 
for (i = 0; i < n; i++) { 
    if (ar[i].day== cday && ar[i].year== cyear && !strcmp(smonth, ar[i].month) { 
     break; 
    } 
} 
if (i<n) { 
    printf("Yes value is there\n"); 
} else { 
    printf("No value isn't\n"); 
} 

你可以做這樣的事情, 但是你有一個小任務寫入功能: month_num_to_string(cmonth,smonth);

+0

有點困難的任務是從輸入的月份字符串中獲取num(包括拼寫錯誤等) –

+0

我很難實現此代碼到我的程序中,主要是因爲我的整個程序在一個月左右解決了字符問題。你能進一步幫助我嗎? – LookingWest

+0

創建一個使用'switch'' case'的函數,並根據接收到的'int'返回一個帶有月份名稱的字符串 –

相關問題