0

次のようなデータがあります。 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保持するデータの範囲外であっても、正しく出力されます。

そのため、その文字列の最初の文字を整数に変換する方法に関する提案を探しています。

ありがとう。

4

1 に答える 1