嵌入式面试中常见的编程题目
以下內容源于網(wǎng)絡資料的學習整理,如有侵權,請告知刪除。
目錄
1、將字符串反轉
2、數(shù)字翻轉和回文判斷
3、大小端問題
(1)判斷大小端
(2)大小端轉換
4、實現(xiàn)函數(shù)memcpy(), strcpy(), strcmp(), strcat()
5、實現(xiàn)最簡單的hello world字符設備驅動
6、設計函數(shù) int atoi(char *s),void itoa(int n, char s[])
7、鏈表操作(單鏈表的插入、刪除節(jié)點、遍歷、反轉)
?
1、將字符串反轉
void reserverString(char str[]) {char tmp;int i, j;for (i = 0, j = strlen(str) - 1; i < j; i++, j--){tmp = str[i];str[i] = str[j];str[j] = tmp;} }char* reserverString1(char* str) {char* start = str;char* end = str + strlen(str) - 1;char tmp;if (NULL != str){do{tmp = *start;*start++ = *end;*end-- = tmp;} while (start<end);}return str; }?
2、數(shù)字翻轉和回文判斷
?
?
3、大小端問題
(1)判斷大小端
方法一:
int main(void) {int a = 0x1234;char b = *((char*)&a);if (b == 0x12)printf("BIGEND\n");if (b == 0x34)printf("littleEND\n");system("PAUSE");return 0; }方法二:用聯(lián)合體
(2)大小端轉換
//對于字數(shù)據(jù)16bit #define BIG2LITTLE(A) ((((A)&0xff00)>>8) | (((A)&0x00ff)<<8)) //對于雙字數(shù)據(jù)32bit #define BIG2LITTLE(A) (((A)&0xff000000)>>24) | (((A)&0x000000ff)<<24) | (((A)&0x0000ff00)<<8) | (((A)&0x00ff00)>>8))?
4、實現(xiàn)函數(shù)memcpy(), strcpy(), strcmp(), strcat()
(1)函數(shù)原型 :void *memcpy(void *dest, const void *src, size_t n);
功能:從源src所指的內存地址的起始位置開始,拷貝n個字節(jié)到目標dest所指的內存地址的起始位置中,函數(shù)返回dest的值。
void *memcpy(void *dest, const void *src, size_t n) {if (NULL == dest || NULL == src)return NULL;char* tmp = (char*)dest;const char* s = (const char*)src;//這里注意下while (n--){*tmp++ = *s++;}return dest; }(2)函數(shù)原型 :void strcpy (char *dest,const char*src);
功能:將src拷貝到dest中
void strcpy(char *dest, const char*src) {while(*dest++=*src++){} }(3)函數(shù)原型 :int strcmp(const char *s,const char * t);
功能:比較字符串s和t,并且根據(jù)s按照字典順序小于,等于或大于t的結果分別返回負整數(shù),0,正整數(shù)。
(4)函數(shù)原型 :char *strcat(char *dest,char *src);
功能:把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')并添加'\0',返回指向dest的指針
5、實現(xiàn)最簡單的hello world字符設備驅動
//1、頭文件的包含 #include <linux/init.h> #include <linux/module.h>//許可的聲明 MODULE_LICENSE("Dual BSD/GPL");//3、函數(shù)注意static、返回值、printk、KERN static int hello_init(void) {printk(KERN_ALERT "Hello World!\n");return 0; } static void hello_exit(void) {printk(KERN_ALERT "Goodbye, cruel world\n"); } //4、注意這兩個宏函數(shù)的使用 module_init(hello_init); module_exit(hello_exit);6、設計函數(shù) int atoi(char *s),void itoa(int n, char s[])
(1)int atoi(char *s)
描述:把字符串轉換成整型數(shù)的一個函數(shù)。int atoi(const char *nptr) 函數(shù)會掃描參數(shù) nptr字符串,跳過前面的空白字符(例如空格,tab縮進)等,可以通過isspace( )函數(shù)來檢測),直到遇上數(shù)字或正負符號才開始做轉換,而在遇到非數(shù)字或字符串結束符('\0')才結束轉換,并將結果返回。如果 nptr不能轉換成 int 或者 nptr為空字符串,那么將返回0。特別注意,該函數(shù)要求被轉換的字符串是按十進制數(shù)理解的。
int atoi(char s[]) {int i, n, sign;for (i = 0; isspace(s[i]); i++); /*跳過空白符:空格時會一直循環(huán),直到遇到不是空格*/sign = (s[i] == '-') ? -1 : 1;//遇到的如果不是-號,比如是數(shù)字,則說明不是負數(shù)if (s[i] == '+' || s[i] == '-') /* 跳過符號 */i++;for (n = 0; isdigit(s[i]); i++)n = 10 * n + (s[i] - '0');return sign * n; }//注意判斷空格、是否是數(shù)字的函數(shù),你懂寫嗎?(2)void itoa(int n, char s[])
功能:將整型數(shù)字轉換為字符串
void itoa(int n, char s[]) {int i, sign;if ((sign = n) < 0) //記錄符號n = -n; //使n成為正數(shù)i = 0;do { //以反序生成數(shù)字 //假設n=987654s[i++] = n % 10 + '0'; //n % 10 + '0'表示數(shù)字對應的字符,比如第一次的數(shù)字是4,變成字符4,是4+'0'} while ((n /= 10) > 0); //此時n變成了98765if (sign < 0)s[i++] = '-';s[i] = '\0';reverse(s); }7、鏈表操作(單鏈表的插入、刪除節(jié)點、遍歷、反轉)
https://blog.csdn.net/oqqHuTu12345678/article/details/78899439
#include <stdio.h> #include <string.h> #include <stdlib.h>typedef struct node {int data;struct node* next; }Node;/********************************************************************* 1、函數(shù)功能:將鏈表反轉 2、實現(xiàn)方法:遍歷+頭插入,即每遍歷一個元素,立即將該元素頭插入 3、函數(shù)返回:反轉后鏈表頭結點的指針 4、之前遇到的、有頭結點的鏈表,頭或尾插入一個數(shù)都很簡單; 5、現(xiàn)在多個數(shù)連續(xù)插入稍微難處理,而且這主要運用在反轉鏈表中。 2018.925 xjh *********************************************************************/Node* reserverLinklist(Node* PH) {Node* p = PH->next;//p表示當前節(jié)點指針Node* pnext = NULL;//pnext表示當前節(jié)點的下一個節(jié)點指針Node* head = NULL;//用來實現(xiàn)頭插入的臨時變量//特殊情況處理:當鏈表沒有有效節(jié)點或者只有一個有效節(jié)點時,逆序不用做任何操作if ((NULL == p) || (NULL == p->next))return PH;while (NULL!=p)//如果當前節(jié)點不為空{pnext = p->next;//后面因為新鏈表頭插入,破壞了p->next,因此先要備份p->next,否則丟失原鏈表的信息//新鏈表頭插入p->next = head;head = p;//恢復p,以便進入到下一個元素(p沒有改變,但p->next改變了,因此不能直接p=p->next)p = pnext;}//這個結束時,p為NULL,head指向原鏈表的最后一個元素,該元素在新鏈表中是第一個元素,下面在該元素前添加頭結點PH->next = head;return PH; }struct node * create_node(int data) {struct node *p = (struct node *)malloc(sizeof(struct node));if (NULL == p){printf("malloc error.\n");return NULL;}p->data = data;p->next = NULL;return p; }void insert_head(Node *pH, Node *newNode) {newNode->next = pH->next;pH->next = newNode; }void traverse(Node* pH) {struct node *p = pH;printf("-----------開始遍歷-----------\n");while (NULL != p->next) {p = p->next;printf("node data: %d.\n", p->data);}printf("-----------遍歷結束-----------\n"); }int main(void) {Node *pHeader0 = create_node(0);//創(chuàng)建頭結點Node *pHeader1 = NULL;insert_head(pHeader0, create_node(11));//11,12,13是所創(chuàng)建的節(jié)點數(shù)據(jù),這里采用頭插法。insert_head(pHeader0, create_node(12));insert_head(pHeader0, create_node(13));//此步過后,數(shù)據(jù)應該為0,13,12,11traverse(pHeader0);//打印13,12,11pHeader1 = reserverLinklist(pHeader0);traverse(pHeader1);//打印11,12,13system("PAUSE");return 0; }?
?
?
?
總結
以上是生活随笔為你收集整理的嵌入式面试中常见的编程题目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用anaconda 下载python所
- 下一篇: mysql类 php100_php m