-2

例:

入力 (dd mm yyyy): 11 11 2011

出力: 2011 年 11 月 11 日

それはちょっと正しいですが、月と年の間に余分な数字があります

削除する方法がわかりません。助けてください!

#include <stdio.h>
int getDay(int day)
{
  switch(day)
  {
    case 1: printf("%dst ", day); break;
    case 2: printf("%dnd ", day); break;
    case 3: printf("%drd ", day); break;
    default: printf("%dth ", day); break;
  }
}
int getMonth(int month)
{
  switch(month)
  {  
    case 1: printf("January "); break;
    case 2: printf("February "); break;
    case 3: printf("March "); break;
    case 4: printf("April "); break;
    case 5: printf("May "); break;
    case 6: printf("June "); break;
    case 7: printf("July "); break;
    case 8: printf("August "); break;
    case 9: printf("September "); break;
    case 10: printf("October "); break;
    case 11: printf("November "); break;
    case 12: printf("December "); break;
    default: printf("Invalid "); break;
  }
}

int main()
{
  int day, month, year;
  printf("Enter date in dd mm yyyy format: ");
  scanf("%d %d %d", &day, &month, &year);
  day = getDay(day);
  month = getMonth(month);
  year = year;
  printf("%d", day);
  printf("%d", month);
  printf("%d", year);
  fflush(stdin);
  getchar();
}
4

5 に答える 5

1

あなたのgetMonth関数 (IMO は と呼ばれるべきですprintMonth) に副作用 (何かを出力する) と、有用な (ただし指定されていない) 値 (つまり、欠落している) の両方があるのはなぜreturnですか? すべての警告を有効にする方法、コンパイラから警告が出なくなるまでコードを改善する方法、デバッガを使用する方法を学ぶ必要があります。Linuxでは、コンパイルしてgcc -Wall -g source.c -o myprogからデバッグすることを意味しますgdb myprog

于 2012-10-22T12:38:18.407 に答える
1

関数getMonth()getDay()関数は両方ともintヘッダーに従ってを返す必要があります。関数からは何も返さないため、これらの行に格納されているものは次のとおりです。

day = getDay(day);
month = getMonth(month); 

誰かの推測ですが、ここにそれらの値を出力しています:

printf("%d", day);   
printf("%d", month); 

「2011 年 11 月 11 日」を表示したいだけの場合は、getDayと関数の両方が void を返すようにし、 and をgetMonth再割り当てせず、出力を再構築します。daymonth

getDay(day);         //print day and "th" or "st" or "rd"
getMonth(month);     //print month
printf("%d", year);  //print year
于 2012-10-22T12:42:37.237 に答える
0
#include <stdio.h>
int getDay(int day)
{
  switch(day)
  {
    case 1: printf("%dst ", day); break;
    case 2: printf("%dnd ", day); break;
    case 3: printf("%drd ", day); break;
    default: printf("%dth ", day); break;
  }
}
int getMonth(int month)
{
  switch(month)
  {  
    case 1: printf("January "); break;
    case 2: printf("February "); break;
    case 3: printf("March "); break;
    case 4: printf("April "); break;
    case 5: printf("May "); break;
    case 6: printf("June "); break;
    case 7: printf("July "); break;
    case 8: printf("August "); break;
    case 9: printf("September "); break;
    case 10: printf("October "); break;
    case 11: printf("November "); break;
    case 12: printf("December "); break;
    default: printf("Invalid "); break;
  }
}

int main()
{
  int day, month, year;
  printf("Enter date in dd mm yyyy format: ");
  scanf("%d %d %d", &day, &month, &year);
  getDay(day);
  getMonth(month);
  printf("%d", year);
  fflush(stdin);
  getchar();
}
于 2012-10-22T12:51:05.620 に答える
0

そのコードには多くのバグと未定義の動作があります。代わりに、次のようなことをお勧めします。

#include <stdio.h>

typedef enum
{
  DAY_FORMAT_ST,
  DAY_FORMAT_ND,
  DAY_FORMAT_RD,
  DAY_FORMAT_TH,
  DAY_FORMAT_N

} day_format_t;

#define MONTHS_N  12


const char* get_day_str   (unsigned int day);
const char* get_month_str (unsigned int month);



int main()
{
  int day;
  int month;
  int year;

  printf("Enter date in dd mm yyyy format: ");
  scanf("%d %d %d", &day, &month, &year);
  getchar(); // clear trailing line feed from stdin


  printf("%d%s ", day, get_day_str(day));
  printf("%s ", get_month_str(month));
  printf("%d", year);
  getchar();
  return 0;
}



const char* get_day_str (unsigned int day)
{
  static const char* DAY_FORMAT [DAY_FORMAT_N] =
  {
    "st",
    "nd",
    "rd",
    "th"
  };

  day_format_t  day_index = day - 1; // compensate for 0-index arrays
  const char*   result;

  if (day_index < DAY_FORMAT_TH)
  {
    result = DAY_FORMAT[day_index];
  }
  else
  {
    result = DAY_FORMAT[DAY_FORMAT_TH];
  }

  return result;
}

const char* get_month_str (unsigned int month)
{
  static const char* MONTH [MONTHS_N] =
  {
    "January",
    "February",    
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
  };

  return MONTH [month-1];
}

コードには、奇妙なユーザー入力を処理するための追加のエラー処理が必要であり、そのようなエラー処理は、関数内ではなく main() 内で行うことが望ましいことに注意してください。

于 2012-10-22T13:24:58.460 に答える
0

あなたは日と月を2回印刷していました ここに再定義されたコードがあります

 #include <stdio.h>
 void getDay(int day)
 {
   switch(day)
 {
      case 1: printf("%dst ", day); break;
       case 2: printf("%dnd ", day); break;
       case 3: printf("%drd ", day); break;
       default: printf("%dth ", day); break;
 }
}
void getMonth(int month)
{
 switch(month)
{
  case 1: printf("January "); break;
   case 2: printf("February "); break;
   case 3: printf("March "); break;
    case 4: printf("April "); break;
case 5: printf("May "); break;
case 6: printf("June "); break;
case 7: printf("July "); break;
case 8: printf("August "); break;
case 9: printf("September "); break;
case 10: printf("October "); break;
case 11: printf("November "); break;
case 12: printf("December "); break;
default: printf("Invalid "); break;
}
}

int main()
{
   int day, month, year;
   printf("Enter date in dd mm yyyy format: ");
    scanf("%d %d %d", &day, &month, &year);
      getDay(day);
    getMonth(month);
    year;
   // printf("%d", day);
  // printf("%d", month);
   printf("%d", year);
   fflush(stdin);
   getchar();
}

これは一つの方法です....

于 2012-10-22T12:46:45.177 に答える