ユーザ入力の処理は、入力、解析の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);
を処理文字がスキャンされています。さらに、 'scanf_s()'はC標準にも属しません。これはMicrosoftの拡張です。 – user3078414
プラットフォームで利用可能な場合は、 'strptime()'/'strftime()'(http://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html/http://pubs.opengroup .org/onlinepubs/9699919799/functions/strftime.html#) – alk
また、 'char meridiem;'は* 1文字のみを保存することに注意してください。 – alk