习题7-8 字符串转换成十进制整数

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式:

输入在一行中给出一个以#结束的非空字符串。

输出格式:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:

+-P-xf4+-1!#

输出样例:

-3905
先贴代码:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 int main() {
 6     int n = 0;                //控制字符串b
 7     int boo = 1;            //1是+  0是-
 8     char a[100];                            //a数组是存放输入字符的
 9     char b[100];                    //b数组是存放符合条件字符的
10     gets(a);
11     int len = strlen(a);
12     for (int i = 0; i < len; i++) {                         //如果符合条件,就把a的字符放到b中
13         if ((a[i] >= 48 && a[i] <= 57) || (a[i] >= 65 && a[i] <= 70) || (a[i] >= 97 && a[i] <= 102)) {
14             b[n] = a[i];
15             n++;
16             if (n == 1) {                               //这里n==1是判断  是不是第一个字符,因为上面n++了,所以此处是1
17                 for (int j = 0; j < i; j++) {
18                     if (a[j] == 45) {
19                         boo = 0;
20                     }
21                 }
22             }
23         }
24         if (a[i] == '#') {
25             break;
26         }
27     }
28     //printf("%d\n",n);
29     if (n == 0) {                   //这里,如果n==0,说明b数组为空,按照题目要求,应该输出0(不管前面有没有负号)
30         printf("0");
31         return 0;
32     }
33     if (boo == 0) {                 //如果前面有符号,这里输出-
34         printf("-");
35     }
36 
37     int lenb = strlen(b);
38     //printf("%d", lenb);
39     int sum = 0;                //sum是和
40     n = 0;                         //n是判断b数组中,各个数字的位置
41     int t = 0;                      //t是临时变量
42     for (int i = lenb - 1; i >= 0; i--) {
43         if (b[i] == 97 || b[i] == 65) {
44             t = 10;
45         }
46         if (b[i] == 98 || b[i] == 66) {
47             t = 11;
48         }
49         if (b[i] == 99 || b[i] == 67) {
50             t = 12;
51         }
52         if (b[i] == 100 || b[i] == 68) {
53             t = 13;
54         }
55         if (b[i] == 101 || b[i] == 69) {
56             t = 14;
57         }
58         if (b[i] == 102 || b[i] == 70) {
59             t = 15;
60         }
61         if (b[i] >= 48 && b[i] <= 57) {
62             t = b[i] - 48;
63         }
64         sum = sum + t * pow(16, n);
65         n++;
66     }
67 
68     printf("%d", sum);
69     return 0;
70 }

代码有注释,就不详细讲解具体的了。

接下来说说思路:

1.先用gets()把用户输入的字符串存到数组a中

2.对数组a进行判断,如果符合条件(是16进制数),就将他存到数组b中。(插一条,如果是第一个符合的数字,再判断它之前有没有负号!!!之前不是前一位,而是全部!!!!!)

3.如果数组b是空的,即说明没有一个符合条件的字符,输出0(题目要求,无论前面有没有负号,都输出0)

4.如果数组b不是空的,就对数组b进行处理,将他的各个位数进行处理(我这里用了比较笨的方法)

5.输出结果!

 

我这个题目题意理解错了,看到它给的实例,我以为是有一个x或者X进行开头的,(因为16进制数是0x或者0X开头),然后我就直接找第一个X,再判断它的前一位是不是符号,错上加错,最后咋写都不对,看了看别人的,才发现理解错了,就及时修正。

最后,写代码还是要写注释,这是一个非常好的习惯,希望大家看到这句话都尽量多写点注释。

谢谢大家!

posted @ 2020-10-19 16:54  沉梦昂志_doc  阅读(1093)  评论(0编辑  收藏  举报