嵌入式软件常用面试题汇总之 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届找工作求助阵地##牛客在线求职答疑中心#嵌入式软件校招笔面试题汇总 文章被收录于专栏
该专栏是我整理的一些嵌入式软件笔面试常见的题目,在有一定计算机基础上,再过一遍该专栏的内容,对应届生校招来说基本上笔面试就没什么问题了! 有任何疑问可随时与我联系,一起交流一起进步。



查看8道真题和解析