次のようなデータがあります。
2s ²S 1/2 0
2p ²P° 1/2 160015
3/2 163990
3s ²S 1/2 1682700
3p ²P° 1/2 1726520
3/2 1727830
3d ²D 3/2 1743500
5/2 1743890
4s ²S 1/2 2252600
4p ²P° 3/2 2270150
1/2 2270150
4d ²D 3/2 2277380
5/2 2277700
4f ²F° 5/2 2278060
7/2 2278140
5s ²S 1/2 2511600
5p ²P° 3/2 2520900
1/2 2520900
...
このデータを、この型で定義された変数に読み込みます。
typedef enum
{
s=0,
p=1,
d=2,
f=3,
g=4,
h=5,
i=6,
k=7,
l=8,
m=9,
n=10,
o=11,
q=12,
r=13,
t=14,
u=15,
v=16,
w=17,
x=18,
y=19,
z=20
} aqn; /* azimuthal quantum number */
typedef struct
{
char *config;
char *term;
int n; /* principle quantum number */
aqn l; /* azimuthal quantum number */
float j;
double level; /* energy level, in cm^-1 */
} nist_t; /* NIST data type */
変数は次のように宣言されますnist_t *nist;
ご覧のとおり、データの 2 列目は に格納されnist->term
ます。
次の宣言があるとします。 unsigned short int S
から情報を得る必要がありますnist->term
。具体的には、最初の文字が '1' または '¹' の場合、 を設定する必要がありますS=1
。
の最初の文字がnist->term
「2」または「²」の場合、 set が必要ですS=2
。
の最初の文字がnist->term
'3' または '³' の場合、 を設定する必要がありますS=3
。
私はそれを試しましたswitch
:
switch(nist[ix].term[0])
{
case '1': S=1;
break;
case '¹': S=1;
break;
case '2': S=2;
break;
case '²': S=2;
break;
... (and so on)
動作しません (実際、コンパイルすらできません)。a の範囲は -127 ~ 127 であることがわかりましたchar
。また、'¹' の値は 185d です。'²' の値は 178d です。'³' の値は 179d です。
文字列を にキャストしようとしましたが、コンパイラはまだステートメント(unsigned int)
について不平を言っています。case
データ構造のフィールドを に変更してみましたunsigned char
。しかし、コード内の が使用されている他の多くの場所でデータ型の競合が発生したため、私のプログラムはコンパイルされませんでしたnist.term
。
変数のデータ型がterm
保持するデータの範囲外であっても、正しく出力されます。
そのため、その文字列の最初の文字を整数に変換する方法に関する提案を探しています。
ありがとう。