c/c++整理--字符串(4)

一、将十进制数转化为二进制和十六进制形式输出

不使用printf系列库函数,通过位运算将十进制数以二进制和十六进制形式的字符串输出。
#include <stdio.h>
#include <stdlib.h>

#define N 32
#define M 10

char sel[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

char* getstr2(const int num)
{
	char *str2 = (char*)malloc(sizeof(char)*N);
	int temp = num, i = 0;
	for(i = 0; i < N; i++)
	{
		str2[i] = '0';
	}
	i = N-1;
	while(temp)
	{
		str2[i] = temp % 2 + 48;
		i--;
		temp = temp / 2;
	}
	return str2;
}

char* getstr16(const int num)
{
	char* str16 = (char*)malloc(sizeof(char)*M);
	int temp = num, i = 0;
	for(i = 0; i < M; i++)
	{
		str16[i] = '0';
	}
	str16[1] = 'x';
	i = M - 1;
	while(temp)
	{
		str16[i] = sel[temp % 16];
		i--;
		temp = temp / 16;
	}
	return str16;
}

int main()
{
	int num;
	char* str2;
	char* str16;
	printf("输入一个十进制数:");
	scanf("%d", &num);
	
	str2 = getstr2(num);
	str16 = getstr16(num);
	
	printf("其二进制为:%s\n", str2);
	printf("其十六进制为:%s\n", str16);
	
	return 0;
}
这道题很简单,只要知道二进制、十进制和十六进制之间的转换规律就可以了,int型数据在32位系统中占4个字节,即32位,所以二进制输出数组应分配32个字节,十六进制的转换要注意是以0x开头的。
输出:
输入一个十进制数:15536
其二进制为:00000000000000000011110010110000
其十六进制为:0x00003CB0


二、编程实现转换字符串、插入字符的个数

据题意,需要在字符串中插入字符统计的个数,例如字符串aaab,插入字符个数后为:aaa3b1.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100

char* transformation(char* str)
{
	int len = strlen(str);
	char *buf = (char*)malloc(sizeof(char)*(len+1));
	
	char *p = str;
	char *q = p+1;
	int count = 1;
	
	while(*q)
	{
		if(*p == *q)
		{
			count++;
			p++;
			q++;
		}
		else
		{			
			itoa(count, buf, 10);
			int nbits = strlen(buf);
			strcat(buf, q);
			*q = '\0';
			strcat(str, buf);
			q+=nbits;
			p = q;
			q = p+1;
			count = 1;
		}
	}
	
	itoa(count, buf, 10);
	strcat(str, buf);
	
	free(buf);
	buf = NULL;
	
	return str;
}

int main()
{
	char str[N];
	printf("please input:");
	scanf("%s", str);
	printf("before transformation:%s\n", str);
	char *pstr = transformation(str);
	printf("after transformation:%s\n", pstr);
	
	return 0;
}

这个程序中,transformation函数用来转换字符串,以“aaab”为例,首先申请5个字节的堆内存buf来存放字符串数字相关信息。初始计数为1,遍历aaab,知道遇到不同的字符,在buf中保存3b,把str变为aaa,然后两者连接,变为aaa3b,一次类推,依次循环。

输出:
please input:aaab
before transformation:aaab
after transformation:aaa3b1


三、字符串编码问题

对于一个长度小于20的字符串进行编码,遵循规则:
(1)把字符串中的字母换成之后的第四个字母,例 a->e,A->E,X->b,y->c,z->d
(2)如果不是字母,不替换
(3)翻转整个字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char arr[] = {'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd'};

void change(char* str)
{
	int len = strlen(str);
	int i = 0;
	for(i = 0; i < len/2; i++)
	{
		char temp = str[i];
		str[i] = str[len-i-1];
		str[len-i-1] = temp;
	}
}

void getfour(char* str)
{
	int i = 0;
	while(*str)
	{
		if((*str >= 'a' && *str <= 'v') || (*str >= 'A' && *str <= 'V'))
		{
			*str += 4;
			str++;
			continue;
		}
		for(i = 0; i < 16; i++)
		{
			if(*str == arr[i])
			{
				*str = arr[i+4];
				break;
			}
		}
		str++;
	}
}

int main()
{
	char hello[] = "hasd11H";
	getfour(hello);
	change(hello);
	printf("%s\n", hello);
	
	return 0;
}
程序中change函数实现了字符串的倒转,getfour函数实现了字符从编码,如果字符是‘a’—‘v’或者‘A’—‘V’,其值加上4就可以了,但是最后的四个字母及其大写要注意,我将之放在一个全局数组里面,只需对数组进行遍历即可。

输出:
L11hwel
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值