おそらくあなたの単純な例では、いくつかのネストされたif
s を使用して実行する方が、より強力な方法を試すよりも簡単ですが、手動で実行したくない場合、または実際の問題が少し大きい場合は、あなたの正規表現による入力 (標準的なレクサーのもの)。
POSIX システムでは、 を使用できますregexec
。
if
編集:(およびselect
)でそれを行う方法:
あなたの入力が入っtext
ていて、すでに NUMBER の終わりまで読んでいると仮定します。したがって、あなたの indexi
はそれを示しています!
// helper function: find next non-whitespace character
char get_prev(char *text, int *end, int i)
{
for (; *end > i; --*end)
if (text[*end] != ' ' && text[*end] != '\t'
&& text[*end] != '\n' && text[*end] != '\r')
// or `if (text[*end] > ' ')` if ASCII
break;
return text[(*end)--];
}
... your function...
// read up to i
int end = strlen(text);
int power_of_10 = 0; // for MULT
enum unit unit = UNKNOWN; // for UNIT
switch (get_prev(text, &end, i))
{
case 'P':
unit = POISE;
break;
case 'A':
unit = AMP;
break;
...
default: // unforeseen character
case '\0':
// neither UNIT nor MULT exist
break;
}
if (unit != UNKNOWN)
switch (get_prev(text, &end, i))
{
case 'M':
power_of_ten = -3; // milli
break;
case 'A':
switch (get_prev(text, &end, i))
{
case 'M':
power_of_ten = 6; // mega
break;
...
}
break;
...
default: // unforeseen character
case '\0':
// MULT doesn't exist
break;
}
この場合、UNIT が必須であると仮定したことに注意してください。MULT と UNIT の両方がオプションの場合、10MA でメガとミリアンペアをどのように区別できるかわかりません。ただし、最初の にさらにケースを追加して、 のswitch
値に対応し、そこにMULT
変更するpower_of_10
ことができます。たとえば、最初に が表示された場合、switch
は存在せず、 3k
であることがわかります。UNIT
power_of_10