盛大游戏面试题----如何修改int类型的第二个字节

最近看了一些面经,看到一个题,之前没有遇到过,但是如果面试中真遇到了,感觉自己应该做不好。今天就把这个题给大家分享下:

题目:给定一个int型变量,如何修改它的第二个字节?

思路:我们都知道一个int型占了4个字节,那么我们如何分离这四个字节,并取出第2个字节呢?我们可以借助一个函数memcpy来实现,memcpy可以将从某个地址开始若干个字节的内存拷贝到另一个内存中。鉴于memcpy不是安全的,我们使用另一个安全的内存拷贝函数memmove函数。memcpy和memmove功能和参数是相通的,只不过memcpy没有处理内存重叠的情况,memmove处理了内存重叠的情况,所以memmove更为安全。

借助于memmove我们将原始内存拷贝到一个字符串中,字符串中的每一个位置的字符就是一个字节的内容。

代码如下:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define BUFFER_SIZE  5
int main(int argc, char * argv[]) {
	char buffer[BUFFER_SIZE] = { 0 };
	int input1 = 0, output1 = 0;
	cout << "size of int: " << sizeof(int) << endl;
	cout << "Please input two integers : " ;
	cin >> input1;
	
	//将int所占内存中的每个字节拷贝到buffer中
	memcpy(buffer, &input1, sizeof(int));
	cout << "original content in buffer: ";
	for (int i = 0; i < BUFFER_SIZE; ++i) {//打印每个字节对应的值
		cout <<  hex << buffer[i] << " ";
	}
	cout << endl;

	//修改buffer中的第2个字节
	buffer[1] = 5;//将int的第二个字节修改为5
	cout << "new content in buffer: ";
	for (int i = 0; i < BUFFER_SIZE; ++i) {//打印每个字节对应的值
		cout << hex << buffer[i] << " ";
	}
	cout << endl;

	//将数组中修改后的内容拷贝到int中,并输出修改后的值
	memcpy(&output1, buffer, sizeof(int));
	cout << "The integer retrieved from buffer: " << output1 << endl;
	return 0;
}


注意这里里边有一个问题,就是在for循环中打印每个字节的内容时使用cout << hex << buffer[i] << " ";打印出来的是乱码,这也是我在第一次写这段代码时遇到的问题。后来经过搜集资料知道了,原来hex只对整形(int)起作用,也就是说如果buffer[i]是个int的话,直接使用hex打印出来的是对应的16进制的数字。但这里buffer是一个char数组,buffer中的每个元素都是char,所以直接使用hex会出现乱码。



知道了问题出现的原因就好办了,我们对buffer[i]做一个强制类型转换将其转换为int即可。即cout << hex << (int)buffer[i] << " ";

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define BUFFER_SIZE     5
int main(int argc, char * argv[]) {
	char buffer[BUFFER_SIZE] = { 0 };
	int input1 = 0, output1 = 0;
	cout << "size of int: " << sizeof(int) << endl;
	cout << "Please input two integers : " ;
	cin >> input1;
	
	
	memcpy(buffer, &input1, sizeof(int));
	cout << "original content in buffer: ";
	for (int i = 0; i < BUFFER_SIZE; ++i) {
		cout <<  hex << (int)buffer[i] << " ";
	}
	cout << endl;


	buffer[1] = 5;//将int的第二个字节修改为5
	cout << "new content in buffer: ";
	for (int i = 0; i < BUFFER_SIZE; ++i) {
		cout << hex << (int)buffer[i] << " ";
	}
	cout << endl;


	memcpy(&output1, buffer, sizeof(int));
	cout << dec << "The integer retrieved from buffer: " << output1 << endl;
	return 0;
}

这下我们可以看到能够正确输出了,数组中每个对应的是16进制的数字。


总结:首先使用memmove将int内存中的内容拷贝到字符数粗中,然后在数组中修改某个字节的值,然后再把数组中的值返回到int中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值