PTA实验7-3-6 字符串转换成十进制整数 (15分)

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

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

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

输入样例:
±P-xf4±1!#
输出样例:
-3905

#include
#include
int main()
{
	char str[1000],str16[20];
	int length=0,count=0,cnt=0,sum=0,t,p;
    
//4种字符串输入的写法

//2种字符串整体输入的写法,其中gets没法用,不是回车结束,#会被当做字符 ,只能用scanf 

	 scanf("%[^#]",str);

// str数组的长度,//区别于length=i;length++的每次结果是当前的i+1。
	 for(int i=0;str[i]!='\0';i++)
	 	length++;
//	 2种利用遍历按照顺序输入

	// scanf("%c",&str[0]); 
	// for(int i=0;str[i]!='#';i++)
	// {
	// 	length++;
	// 	scanf("%c",&str[i+1]);	
	// }

	char ch=getchar();
	for(int i=0;ch!='#';i++)
	{
		length++;
		str[i]=ch;
		ch=getchar();
	}
//		puts(str);

//	 遍历数组str找到符合条件的元素赋值给str16 
	for (int i=0;i<length;i++)         
	{
		if(str[i]=='-'&&count==0)
		{
			str16[0]='-';
			count++;
		}
		if(48<=str[i]&&str[i]<=57||(97<=str[i]&&str[i]<=102)||(65<=str[i]&&str[i]<=70))
		{
			str16[count]=str[i];
			count++;
		}		
	}

//	4种等价的字符串输出
//	puts(str16);
//	printf("%s\n",str16);
//	for(int i=0;i
//		printf("%c",str16[i]);
//	putchar(str16[0]); 

//	将str16数组中的字符先转化为16进制数,再转化为10进制数 
	for(int i=count-1;i>=0;i--)
	{
		
		if(str16[i]=='-')
		sum=sum*(-1);
		else
		{
			if(48<=str16[i]&&str16[i]<=57)
			 	t=str16[i]-48;
			if(65<=str16[i]&&str16[i]<=70)
				t=str16[i]-55;
			if(97<=str16[i]&&str16[i]<=102)
				t=str16[i]-87;
			p=pow(2,4*cnt);
			sum=sum+p*t;
			// printf("%d\t%d\t%d\t%d\n",str16[i],t,cnt,p);
			cnt++;	
		}
	}
	printf("%d",sum);
	return 0;
 } 

你可能感兴趣的:(PTA,学习总结,c语言小技巧)