4-7-2 字符串转换成十进制整数 (15 分)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
1.第一种情况:与原题一致,只要第一个16进制码前面有符号就行
#include <stdio.h>
#include <math.h>
int isHex(char c)
{
if (c >= 'a' && c <= 'f')return c - 'a' + 10;//a就是10+1;
if (c >= 'A' && c <= 'F')return c - 'A' + 10;//与上面同理
if (c >= '0' && c <= '9')return c - '0';
return -1;
}
int exa(char c)
{
if (c == '-')
return 1;
else
return 0;
}
int main()
{
long x = 0;
int f;
long int i = 0, j = 0, sum = 0, m, flag = 0, z = 1;
char c;
char s[100], k[100];
while ((c = getchar()) != EOF)
{
s[i] = c;
++i;
}
s[i] = '\0';
i = 0;
for (i = 0, j = 0; s[i] != '#'; i++)
{
if (isHex(s[i]) != -1)
{
k[j] = s[i];
++j;
}
}
for (i = 0, m = j; i < j; i++, m--)
{
sum = isHex(k[i]) * pow(16, m - 1) + sum;
}
for(i = 0;s[i] != '#';i++)
{
if (isHex(s[i]) != -1)
{
break;
}
if (s[i] == '-')
{ z = -1;
break;
}
}
k[j] = '\0';
printf("%d", sum * z);
}
2.第二种情况:当负号后面紧跟着那个字母时
```c
#include <stdio.h>
#include <math.h>
int isHex(char c)
{
if (c >= 'a' && c <= 'f')return c - 'a' + 10;//a就是10+1;
if (c >= 'A' && c <= 'F')return c - 'A' + 10;//与上面同理
if (c >= '0' && c <= '9')return c - '0';
return -1;
}
int exa(char c)
{
if (c == '-')
return 1;
else
return 0;
}
int main()
{
long x = 0;
int f;
long int i = 0, j = 0, sum = 0, m, flag = 0, z = 1;
char c;
char s[100], k[100];
while ((c = getchar()) != EOF)
{
s[i] = c;
++i;
}
s[i] = '\0';
i = 0;
for (i = 0, j = 0; s[i] != '#'; i++)
{
if (isHex(s[i]) != -1)
{
k[j] = s[i];
++j;
}
}
for (i = 0, m = j; i < j; i++, m--)
{
sum = isHex(k[i]) * pow(16, m - 1) + sum;
}
for (i = 0; s[i] != '#'; i++)
{
flag = 0;
if (isHex(s[i]) != -1)//第一个16进制出现
{
if (i > 0)
{
if (s[i - 1] == '-')//第一个就是ascii
{
z = -1;
break;
}
else
break;
}
}
else break;
}
k[j] = '\0';
printf("%d", sum * z);
}