繁体   English   中英

在C中测试值大于127的ASCII字符

[英]Testing for ascii characters whose value is > 127 in C

我有一些类似的数据: 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;

如您所见,数据的第二列将存储在nist->term

假设我有以下声明: unsigned short int S

我需要从nist->term获得一些信息。 具体来说,如果第一个字符是'1'或'¹',那么我需要设置S=1

如果nist->term的第一个字符是'2'或'²',那么我需要设置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)

它不起作用(实际上,它甚至无法编译)。 我发现一个char的范围是-127到127。“¹”的值是185d。 “²”的值为178d; “³”的值为179d。

我尝试将字符串转换为(unsigned int) ,并且编译器仍然抱怨case语句。

我尝试将数据结构中的字段更改为unsigned char 但是后来我的程序没有编译,因为在使用nist.term的代码中有很多其他地方数据类型冲突。

尽管变量term的数据类型超出了所保存数据的范围,但仍可以正确打印出来。

因此,寻找有关如何将字符串中的第一个字符转换为整数的建议。

谢谢。

我这样解决了这个问题:

nist_t *prtnist_r(nist_t *nist,unsigned short int n_low,unsigned short int n_high, unsigned short int l_low, unsigned short int l_high, unsigned short int degeneracy)
{
unsigned short int a=0; /* used as index counter */
unsigned short int spin_multiplicity=0; /* spin_multiplitiy=2S+1 */

while((NULL!=nist[a].config) && (NULL!=nist[a].term))
{
    if((nist[a].term[0]==-62 && nist[a].term[1]==-71) || nist[a].term[0]==49)
        spin_multiplicity=1;
    if((nist[a].term[0]==-62 && nist[a].term[1]==-78) || nist[a].term[0]==50)
        spin_multiplicity=2;
    if((nist[a].term[0]==-62 && nist[a].term[1]==-77) || nist[a].term[0]==51)
        spin_multiplicity=3;
    if(nist[a].term[0]==52)
        spin_multiplicity=4;
    if(nist[a].term[0]==53)
        spin_multiplicity=5;

    if(nist[a].config[0]!='-')
    {
        if(nist[a].n>=n_low && nist[a].n<=n_high && nist[a].l>=l_low && nist[a].l<=l_high)
        {
            if(degeneracy==0 || degeneracy==spin_multiplicity)
            {
                (void)fprintf(stderr,"%s\t%d\t%d\t%s\t%14.8e\n",nist[a].config,nist[a].n,nist[a].l,nist[a].term,nist[a].level);
            }
        }
    }
    else
        (void)fprintf(stderr,"%s\t%s\t%s\t%s\t%14.8e\n","Limit","--","--","--",nist[a].level);
    ++a;
}
return nist;
}       

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM