嵌入式软件常用面试题汇总之 C/C++ 语言相关(3)
C/C++之常考基础编程题汇总
1.下面这段程序的输出是?
void f(char**); main() { char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" }; f(argv); } void f( char **p ) { char* t; t= (p+= sizeof(int))[-1]; printf( "%s" , t); }
答案:cd
2.编程实现strcmp
原型:extern int strcmp(const char s1,const char s2); 用法:#include < string.h > 功能:比较字符串s1和s2。 一般形式:strcmp(字符串1,字符串2) 说明: 当s1 < s2时,返回值<0 当s1 = s2时,返回值=0 当s1 > s2时,返回值>0 #include <stdio.h> // 实现 strcmp 函数 int my_strcmp(const char *str1, const char *str2) { while (*str1 && (*str1 == *str2)) { str1++; str2++; } // 返回两字符 ASCII 码之差 return *(unsigned char *)str1 - *(unsigned char *)str2; } int main() { char str1[] = "hello"; char str2[] = "hello"; char str3[] = "world"; char str4[] = "hell"; printf("Comparing '%s' and '%s': %d\n", str1, str2, my_strcmp(str1, str2)); // 输出 0 printf("Comparing '%s' and '%s': %d\n", str1, str3, my_strcmp(str1, str3)); // 输出负数 printf("Comparing '%s' and '%s': %d\n", str1, str4, my_strcmp(str1, str4)); // 输出正数 return 0; }
3.编程判断字符串是不是回文
#include <stdio.h> #include <string.h> #include <stdbool.h> // 判断字符串是否是回文 bool isPalindrome(const char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { if (str[i] != str[len - i - 1]) { return false; } } return true; } int main() { char str1[] = "racecar"; char str2[] = "hello"; char str3[] = "madam"; char str4[] = "palindrome"; printf("'%s' is palindrome: %s\n", str1, isPalindrome(str1) ? "true" : "false"); printf("'%s' is palindrome: %s\n", str2, isPalindrome(str2) ? "true" : "false"); printf("'%s' is palindrome: %s\n", str3, isPalindrome(str3) ? "true" : "false"); printf("'%s' is palindrome: %s\n", str4, isPalindrome(str4) ? "true" : "false"); return 0; }
4.编写字符串反转函数,要求时间和空间效率都尽量高。函数原型为:char* strrev(char* dest, char* src)
#include <stdio.h> #include <string.h> // 实现字符串反转函数 char* strrev(char* dest, const char* src) { int len = strlen(src); // 获取源字符串的长度 // 指向 src 末尾的指针(不包括终止符) const char *src_end = src + len - 1; // 如果 dest 和 src 是同一个指针,我们可以原地反转 if (dest == src) { for (int i = 0; i < len / 2; i++) { // 交换字符 char temp = dest[i]; dest[i] = dest[len - i - 1]; dest[len - i - 1] = temp; } return dest; } // 如果 dest 和 src 不同,我们在 dest 中写入 src 的反转字符 for (int i = 0; i < len; i++) { dest[i] = *src_end--; } dest[len] = '\0'; // 添加字符串终止符 return dest; } int main() { char str1[] = "hello"; char str2[6]; // 确保目标字符串有足够的空间来存储反转后的字符串 printf("Original: %s\n", str1); printf("Reversed: %s\n", strrev(str2, str1)); // 反转到另一个字符串中 printf("Original: %s\n", str1); printf("In-place Reversed: %s\n", strrev(str1, str1)); // 原地反转 return 0; }
5.写出 float x 与“零值”比较的 if 语句
#include <stdio.h> #include <math.h> int main() { float x = 0.0f; // 可以根据需要改变x的值进行测试 float epsilon = 1e-6; // 设置一个非常小的容差值 if (fabs(x) < epsilon) { printf("x is approximately zero.\n"); } else { printf("x is not zero.\n"); } return 0; }
在C语言中,比较浮点数(如 float 类型)是否等于零需要特别注意,因为浮点数在计算机中的表示和存储可能会导致精度问题。直接使用 == 进行比较可能会导致不准确的结果。因此,通常的做法是检查浮点数是否在一个非常小的范围内接近零。
可以直接这样: if(x>0.000001&&x<-0.000001)
6.编程实现删除有序数组中的重复元素
#include <stdio.h> // 实现删除有序数组中的重复元素 int removeDuplicates(int* nums, int numsSize) { if (numsSize == 0) return 0; int newLength = 1; // 新数组的长度至少为1,因为第一个元素肯定是唯一的 for (int i = 1; i < numsSize; i++) { if (nums[i] != nums[newLength - 1]) { nums[newLength] = nums[i]; newLength++; } } return newLength; } int main() { int nums[] = {1, 1, 2, 3, 3, 4, 4, 5}; int numsSize = sizeof(nums) / sizeof(nums[0]); int newLength = removeDuplicates(nums, numsSize); printf("Array after removing duplicates: "); for (int i = 0; i < newLength; i++) { printf("%d ", nums[i]); } printf("\nNew length: %d\n", newLength); return 0; }
7.以下这段程序输出的结果是什么?
main() { int i=3; int j; j = sizeof(++i+ ++i); printf("i=%d j=%d", i ,j); }
答案:i=3 j=2
sizeof 操作符给出其操作数需要占用的空间大小,它是在编译时就可确定的,所以其操作数即使是一个表达式,也不需要在运行时进行计算。( ++i + ++ i ) 是不会执行的,所以 i 的值还是 3。
8.以下这段程序输出的结果是什么?
main() { char p; char buf[10] ={ 1,2,3,4,5,6,9,8}; p = (buf+1)[5]; printf("%d" , p); }
答案:9
对某些类型 T 而言,如果一个表达式是 T[] ( T 的数组), 这个表达式的值实际上就是指向该数组的第一个元素的指针。所以 (buf+1)[5] 实际上就是 *(buf +6) 或者 buf[6]
#嵌入式##面经##C/C++##23届找工作求助阵地##牛客在线求职答疑中心#嵌入式软件校招笔面试题汇总 文章被收录于专栏
该专栏是我整理的一些嵌入式软件笔面试常见的题目,在有一定计算机基础上,再过一遍该专栏的内容,对应届生校招来说基本上笔面试就没什么问题了! 有任何疑问可随时与我联系,一起交流一起进步。