一、将十进制数转化为二进制和十六进制形式输出
不使用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