2017-03-26 18 views
1

- 私は現在としてそれを持っているC

scanf("%d%d%d",&day1,&mon1,&year1); 

私は次のようになることです日付を渡したときにこれが正常に動作します:

私はこの方法を試してみました

02/02/2016 

02-02-2016 
は、しかし、私は私が代わりにダッシュのスラッシュとそれを渡した場合、それはまた、罰金になりたい

scanf("%d/%d/%d",&day1,&mon1,&year1); 

さて、これはスラッシュ(/)を受け入れますが、しかしダッシュをサポートしていません( - )

それはどのように両方を受け入れることができます?

どうすればいいですか?私はこの言葉に慣れていないので、助言のいくつかの並べ替えは素晴らしいだろう。事前に感謝

+0

本当に人が入力できるものにいかに制限したいかによって決まります。整数の間に任意の1文字を置くことができるようにしますか?任意の文字数ですか?許可されているものと許可されていないものに特化していない場合は、方法を指定するのは難しいです。 – jakeehoffmann

+0

私が今やっておきたいのは、整数の間にダッシュとスラッシュを受け入れることだけです。 02-02-2016または02/02/2016と入力することができます –

答えて

1
char junk; 
scanf("%d%c%d%c%d", &day1, &junk, &mon1, &junk, &year1); 

これは動作します。あなたが読んでいる文字で何もする必要はありません。-または/以外のものを許可しない場合は、それらの文字に2つの変数を使用して、それらが値であるかどうかを確認できますあなたは許可していますし、その後printf("Invalid input")または反応します。

例は、正しいまで読ん入力を保持します:

char delim1, delim2; 
do { 
    printf("Please enter date (dd-mm-yy or dd/mm/yy):"); 
    scanf("%d%c%d%c%d", &day1, &delim1, &mon1, &delim2, &year1); 
} while (delim1 != '-' && delim1 != '/' && delim2 != '-' && delim2 != '/'); 
+0

この方法では、両方の区切り文字にアクセスできるため、(たとえば)それらを混在させる入力を拒否することができます(_e.g._、5/9-2017または3-26/2018) –

+0

ええ、良い点(私は実際に使っていませんでした)。 – jakeehoffmann

+0

両方のデリミタが同じタイプであることを確認しない場合は、単に 'scanf("%u%* 1 [ - /]%u%* 1 [ - /]%u "、&uday1、&umon1、&uyear1 ) 'であり、3つの変数は' unsigned int'型です。 –

2

あなたが好きなフォーマット文字列を使用することができます唯一のダッシュを受け入れるか、数字の間スラッシュが、文字があるものは何でも捨てて"%d%*[-/]%d%*[-/]%d"。 (これは私のscanf知識の限界に達しています;私はこれまで実際にこの機能を使用したとは思わない)

+0

これも機能します。最終的には、それがどれくらい制限的であるかに依存します。 – jakeehoffmann

関連する問題