问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 using namespace std; 5 int main(void) 6 { 7 int n; 8 int temp; 9 char* arr = new char[9]; //要给‘\0’留一位 10 cin >> arr; 11 n = strlen(arr); //计算字符串长度 12 long long sum = 0; //用long long防止结果过大 13 for (int i = 0; arr[i]!=‘\0‘; i++) //最后一位是‘\0‘,不用算进去 14 { 15 switch (arr[i]) 16 { 17 case ‘A‘: temp = 10; break; 18 case ‘B‘: temp = 11; break; 19 case ‘C‘: temp = 12; break; 20 case ‘D‘: temp = 13; break; 21 case ‘E‘: temp = 14; break; 22 case ‘F‘: temp = 15; break; 23 default: temp = arr[i] - ‘0‘; break; 24 } 25 sum = sum + temp * pow(16, n - 1- i); 26 } 27 cout << sum; 28 return 0; 29 }
注意问题:(1)题目要求不超过8位,也就是说最大可为8位,但是还要考虑字符串数组最后一位必须是‘\0‘,所以创建数组的时候是char[9]而不是char[8]
(2)最后10进制结果用long long而不用int是为了防止结果过大溢出无法表示
(3)关于字符串计数的问题:strlen函数求出的字符串长度是有效长度,是不包含末尾的‘\0‘的,所以在最后求sum的值的时候,用n-1-i而不是减2
补充:
1.strlen()函数求出的字符串长度为有效长度,既不包含字符串末尾结束符 ‘\0’;
2.sizeof()操作符求出的长度包含字符串末尾的结束符 ‘\0’;
3.length()函数求出的字符串长度不包含字符串末尾结束符’\0’;
4.当在函数内部使用sizeof()求解由函数的形参传入的字符数组的长度时,得到的结果为指针的长度,既对应变量的字节数,而不是字符串的长度,此处一定要小心。
5.C/C++的strlen(str)和str.length()和str.size()都可以求字符串长度。其中str.length()和str.size()是用于求string类对象的成员函数,strlen(str)是用于求字符数组的长度,其参数是char*。
6.这三种函数strlen、length、size函数计算的字符串长度都不算最后的操作符’\0’。
7.strlen函数用之前需要先对字符数组定义,例如char str[]={“hello world”};或者char str[]={‘h’,‘e’,‘l’,‘l’,‘o’,’ ‘,‘w’,‘o’,‘r’,‘l’,‘d’,’\0’};
8.getchar()就是从键盘获取字符,直到回车为止。
第一种:strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。
第
二种:sizeof(),求所占总空间的字节数。
参考链接:https://blog.csdn.net/qq_41823255/article/details/102318011?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158389046319725256732114%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158389046319725256732114&biz_id=0&utm_source=distribute.pc_search_result.none-task
原文地址:https://www.cnblogs.com/guanrongda-KagaSakura/p/12460657.html