最近看了一些面经,看到一个题,之前没有遇到过,但是如果面试中真遇到了,感觉自己应该做不好。今天就把这个题给大家分享下:
题目:给定一个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;
}
知道了问题出现的原因就好办了,我们对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中。