嵌入式软件常用面试题汇总之 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届找工作求助阵地##牛客在线求职答疑中心#

该专栏是我整理的一些嵌入式软件笔面试常见的题目,在有一定计算机基础上,再过一遍该专栏的内容,对应届生校招来说基本上笔面试就没什么问题了! 有任何疑问可随时与我联系,一起交流一起进步。

全部评论
觉得本文有用的话,给博主点个赞吧!!谢谢大家!!
点赞 回复 分享
发布于 05-25 17:21 广东
1.这段程序的输出是 "cd"。 2.这是一个实现 strcmp 函数的示例,用于比较两个字符串。 3.这是一个判断字符串是否是回文的示例。 4.这是一个编写字符串反转函数的示例,要求时间和空间效率都尽量高。 5.这是一个写出 float x 与“零值”比较的 if 语句的示例。 6.这是一个编程实现删除有序数组中的重复元素的示例。 7.这段程序的输出是 "i=3 j=2"。 8.这段程序的输出是 "9"。
点赞 回复 分享
发布于 05-25 17:21 AI生成
第一题gh,我还寻思这么久
点赞 回复 分享
发布于 05-30 16:05 湖北

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
1 5 评论
分享
牛客网
牛客企业服务