MTK联发科2021 嵌入式C笔试题分析

嵌入式Linux

共 1682字,需浏览 4分钟

 ·

2020-07-20 00:17

df5596aac9c6cbc9db8e86bef4f28829.webp

题目-分割字符串

因为题目是考试的同学凭记忆记下来的,没有记得特别仔细,题目只是写了个大概,我也是凭自己的想法来理解。

输入

aaa;bbb;ccc

输出

aaa
bbb
ccc
/*--------------------------------------------*/
输入

,hello,hello,,

输出

hello
hello

这个题目会使用到什么知识点呢?

C库字符串分割函数 strtok

函数声明:

char *strtok(char *str, const char *delim)

作用:  使用分隔符delim分解字符串str。

返回值

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

注意:分割处理后原字符串 str 会变。

举个例子
#include 
#include 
 
int main () {
   char str[80] = "my,name,is,weizenan,happy,,,,";
   const char s[2] = ",";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
 
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf"%s\n", token );
      printf("str:%s\n",str);
      token = strtok(NULL, s);
   }
   printf("\n%s\n",str);
   return(0);
}

输出

my
str:my
name
str:my
is
str:my
weizenan
str:my
happy
str:my

my

--------------------------------
Process exited after 0.02338 seconds with return value 0
请按任意键继续. . .
上面题目的答案
# include 
# include 

int split(char *src,const char *separator,char **dest) 
{
 /*
  src 需要分割的字符串 
  separator 指定的分割字符
  dest 接收子字符串的数组
  返回分割字符串个数 
 */
     char *pNext = NULL;
     int count = 0;
     /*如果传入的地址为空或长度为0,直接终止 */
     if (src == NULL || strlen(src) == 0) 
        return (0);
     /*如未指定分割的字符串,直接终止 */
     if (separator == NULL || strlen(separator) == 0) 
        return (0);
     /*第一次,先保存下第一次的分割结果*/
     pNext = (char *)strtok(src,separator); 
     while(pNext != NULL) {
        /*把分割结果存放在 字符串数组里面*/ 
          *dest++ = pNext;
          ++count;
         /*必须使用(char *)进行强制类型转换*/
         pNext = (char *)strtok(NULL,separator);  
    }  
    return count;
}  

int main()
{
 int i;
 char buf[30];/*"aaa;bbb;ccc"*/
 /*存放分割结果*/ 
 char *revbuf[8] = {0};
 
 /*分割后子字符串的个数*/
 int num = 0;
 
 gets(buf);
 num = split(buf,";",revbuf); //调用函数进行分割 
 
 /*输出分割结果*/
 for(i = 0;i < num; i ++) 
 {
  printf("%s\n",revbuf[i]);
 }

 return 0;
}

输出

124;oajsidfji;jijdiji990;;9090;90
124
oajsidfji
jijdiji990
9090
90

--------------------------------
Process exited after 15.47 seconds with return value 0
请按任意键继续. . .
其他题目

这部分的答案先不放出来,我觉得大家可以讨论看看,有哪道题不明白的,可以在留言回复,也可以自己去寻找答案。

这题应该是送分题

int Add(int Number-1,int Number2)
{
  int Sum = Number-1;
  Sum+=Number2;
  retrun sum;
}

which one is correct (multi selections) 1)There will be compile errors at the first line 2)Number-1 is an illegal varibale name 3)Number2 is an illegal variable name 4)Sum and sum refer to the same variable

这题应该也是送分题

int a = 0x0077;
int b = 0x0088;
int c = 0xff00;
int d = a | b | c;
int e = c & d;
d=?
e=?
int sum(int n)//calc the sum for 1+2+3+...n
{
 int i=1;
 intnSum =0;
 while(i<=n)
 nSum+= i;
 i++;

 retrun nSum;
}

which ones are correct

1)Use while loop is wrong use if loop isthe only choice. 2)we should change all int to unsigned int in the codes 3)at line 007, we should change (i<=n)to (i

int foo(int x ,int y)
{
 while(x){
  ++x;
  ++y;
 }
 if(y)
 --y;
 return x+y;
}

求下面两个函数的输出结果 

foo(-1,0)=?

foo(0,-1)=?

int Test(int n)
{
 int i;
 int ret=0;
 for(i=1;i<=n;i++)
 {
    if(i>10)
    break;
    if(i>=3&&i<=5)
    continue;

    ++ret;
  }
  return ret;
}

int main(int argc,char*argv[])
{
  Test(4);
  Test(12);
}
  • 定义一个宏计算一年有多少秒
  • 写strcopy 函数原型
  • 写一个宏返回两个数比较的最小值
总结

按照常规操作,字符串的笔试题是少不了的,大家在准备的时候,需要准备好,比如我们字符串操作的很多函数都在头文件strings.h里面,我们要急着这个函数。

在Linux 下面,我们经常使用 getopt_long 函数来解析用户输入,这个函数也非常牛逼,如果有感兴趣的同学,可以去研究看看。

我在公众号里面准备了一个笔试的资料,在公众号后台回复 「C笔试宝典」获取。


浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报