1. 程式人生 > >盛大遊戲面試題----如何修改int型別的第二個位元組

盛大遊戲面試題----如何修改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中。