2016-05-22 12 views
0

K.N. King's book C Programming:近代的なアプローチである第7章には、12時間の入力を求めてから24時間に変換するエクササイズ9(およびエクササイズ8)があります。ユーザーから12時間形式で時刻を取得し、24時間形式に変換する

9:11 PM - > 21:11

私の質問には、時間の取得方法を理解しています。 8:37 PMまたは8:37 [space] PMですが、どちらのフォーマットでも動作させる方法はわかりません。

おかげ

int h, m; 
char meridiem; 

printf("Enter a 12-hour time: "); 
scanf_s("%d:%d%c", &h, &m, &meridiem); 

printf("%c\n", meridiem); 

注:私は、私は一つだけの文字を取得していますことを実現します。

+2

を処理文字がスキャンされています。さらに、 'scanf_s()'はC標準にも属しません。これはMicrosoftの拡張です。 – user3078414

+0

プラットフォームで利用可能な場合は、 'strptime()'/'strftime()'(http://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html/http://pubs.opengroup .org/onlinepubs/9699919799/functions/strftime.html#) – alk

+1

また、 'char meridiem;'は* 1文字のみを保存することに注意してください。 – alk

答えて

1

ユーザ入力の処理は、入力、解析の2つのステップで処理するのが最適です。 次に、がデータを処理します。

ステップ1:入力を解析:単純なユーザー入力

printf("Enter a 12-hour time: "); 
fflush(stdout); // Insure output is completely sent 

char buf[80]; 
if (fgets(buf, sizeof buf, stdin) == NULL) Handle__InputClosed(); 

ステップ2を読み出します。多くのアプローチ。これは、正常に解析された入力の終わりを検出するために"%n"を使用します。 "%n"は、スキャンの現在のオフセットを保存するために使用されます。 "%d %1[aApP]"のスペースは、分と午前/午後の間のユーザー入力にスペースが発生することを可能にします。

int hour, minute; 
char meridian[2]; 
int n = 0; 
sscanf(buf, "%d:%d %1[aApP]%*[mM] %n", &hour, &minute, meridian, &n); 
if (n == 0 || buf[n] || hour < 0 || minute < 0 || hour >= 12 || minute >= 60) { 
    puts("Bad input"); 
    return -1; 
} 

ステップ3:あなたは何も唯一その最初、何でも、あなたの説明では、2文字の単語である必要がありさえ `meridiem`指定を変換しない提出のコードでは、検証入力

meridian[0] = toupper(meridian[0]); 
if (meridian[0] == 'A') { 
    if (hour >= 12) hour -= 12; // 12:00 AM --> 0:00 
} else { 
    hour += 12; 
} 
printf("%d:%02d\n", hour, minute); 
関連する問題