C语言编程挑战,5道经典面试试题与解答
C语言,作为一门高级编程语言,自诞生以来就以其高效、灵活的特点,在操作系统、嵌入式系统、游戏开发等多个领域占据了重要地位,对于程序员来说,掌握好C语言不仅是提升个人技能的关键,也是进入名企的敲门砖之一,我们就来挑战5道经典的C语言面试题,看看你能答对几道?每道题都附有详细的解析和代码示例,希望能帮助大家更好地理解C语言的核心概念。
题目一:字符串反转
题目描述:编写一个函数reverse_string(char *str),功能是将传入的字符串str进行原地反转,当str为“hello”时,反转后应变为“olleh”。
解题思路:可以采用双指针法,一个指向字符串的头部,另一个指向尾部,然后交换两者所指向的字符,接着向中心移动,直至两指针相遇或交叉。
代码实现:
#include <stdio.h>
#include <string.h>
void reverse_string(char *str) {
int len = strlen(str);
char temp;
for (int left = 0, right = len - 1; left < right; left++, right--) {
// 交换两个位置的字符
temp = str[left];
str[left] = str[right];
str[right] = temp;
}
}
int main() {
char str[] = "hello";
printf("Original: %s\n", str);
reverse_string(str);
printf("Reversed: %s\n", str);
return 0;
}题目二:斐波那契数列
题目描述:编写一个函数fibonacci(int n),计算并返回斐波那契数列第n项的值,斐波那契数列定义如下:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)。

解题思路:可以使用递归实现,但对于较大的n效率极低,更好的方法是使用迭代,仅需常数空间复杂度即可完成。
代码实现:
#include <stdio.h>
int fibonacci(int n) {
if (n <= 1) return n;
int prev = 0, curr = 1;
for (int i = 2; i <= n; i++) {
int next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
int main() {
int n = 10;
printf("Fibonacci(%d) = %d\n", n, fibonacci(n));
return 0;
}题目三:判断字符串是否为回文串
题目描述:编写一个函数is_palindrome(const char *str),判断给定字符串str是否为回文串,所谓回文串是指正读反读都一样的字符串。
解题思路:同样可采用双指针的方法,一个从头开始遍历,另一个从尾开始,比较对应位置上的字符是否相同。
代码实现:
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
bool is_palindrome(const char *str) {
int len = strlen(str);
for (int left = 0, right = len - 1; left < right; left++, right--) {
if (str[left] != str[right]) return false;
}
return true;
}
int main() {
const char *str1 = "madam";
const char *str2 = "test";
printf("%s is palindrome? %s\n", str1, is_palindrome(str1) ? "Yes" : "No");
printf("%s is palindrome? %s\n", str2, is_palindrome(str2) ? "Yes" : "No");
return 0;
}题目四:求最大公约数
题目描述:编写一个函数gcd(int a, int b),求两个正整数a和b的最大公约数。
解题思路:利用辗转相除法(欧几里得算法),即用较大数除以较小数,再用上一步中的除数去除余数,重复此步骤直到余数为零,最后的除数即为最大公约数。
代码实现:
#include <stdio.h>
int gcd(int a, int b) {
while (a % b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return b;
}
int main() {
int x = 60, y = 48;
printf("GCD of %d and %d is %d\n", x, y, gcd(x, y));
return 0;
}题目五:查找子串
题目描述:编写一个函数strstr(const char *haystack, const char *needle),在字符串haystack中查找子串needle第一次出现的位置,如果找到则返回该位置的指针,否则返回NULL。
解题思路:使用滑动窗口法,逐字符比较haystack与needle,直至匹配成功或haystack结束。
代码实现:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char* strstr(const char *haystack, const char *needle) {
int m = strlen(haystack), n = strlen(needle);
if (n == 0) return (char *)haystack;
for (int i = 0; i <= m - n; i++) {
int j;
for (j = 0; j < n; j++)
if (haystack[i + j] != needle[j]) break;
if (j == n) return (char *)(haystack + i);
}
return NULL;
}
int main() {
const char *haystack = "hello world";
const char *needle = "world";
const char *result = strstr(haystack, needle);
if (result) printf("Substring found at position: %p\n", result);
else printf("Substring not found.\n");
return 0;
}就是我们精心挑选的五道C语言面试题及解答方案,通过这些练习,不仅能巩固基础知识,还能提高解决实际问题的能力,希望各位读者朋友能够有所收获!
相关文章
-
ASP网站制作,打造你的数字魔法屋详细阅读
你有没有想过,互联网上的那些炫酷网站是怎么被搭建起来的?就像建造一座房子一样,制作一个网站也需要合适的工具和材料,而今天我们要聊的主角——ASP(Ac...
2026-04-09 5
-
CSR是什么?企业如何通过做好事赢得人心与未来详细阅读
你有没有想过,为什么有些企业在赚钱的同时,还能让社会对它们竖起大拇指?为什么越来越多的消费者愿意为某些品牌买单,即使这些品牌的产品价格更高?答案可能就...
2026-04-09 6
-
百度恶意点击器,广告主的噩梦,还是数字营销的隐形杀手?详细阅读
在数字化浪潮席卷全球的今天,互联网广告已经成为企业推广品牌、吸引客户的重要手段,就像每一枚硬币都有两面一样,互联网广告背后也隐藏着一些令人头疼的问题—...
2026-04-09 6
-
OTG连接线,打开设备互联新世界的小钥匙详细阅读
在现代科技的浪潮中,我们每天都与各种智能设备打交道,从智能手机到平板电脑,从相机到U盘,这些设备让我们的生活更加便捷和多彩,有时你会发现一个问题:如何...
2026-04-09 6
-
XP运行命令全解析,让你的老旧系统焕发新生机详细阅读
Windows XP作为一款经典的操作系统,虽然微软早已停止对其提供支持,但它在许多用户心中仍然占据着不可替代的地位,无论是怀旧情怀还是实际需求,仍有...
2026-04-09 5
-
安卓SD卡加密软件,保护你的数字隐私,就像给钱包加把锁!详细阅读
在如今这个数字化飞速发展的时代,我们的手机已经成为生活的中心,无论是工作文件、家庭照片,还是银行信息和聊天记录,几乎所有的私人数据都存储在手机里,而S...
2026-04-09 5
-
昂达平板电脑刷机全攻略,轻松解锁设备潜力详细阅读
随着科技的飞速发展,平板电脑已经成为我们日常生活中不可或缺的一部分,无论是办公、学习还是娱乐,平板电脑都能为我们提供极大的便利,在使用过程中,我们可能...
2026-04-09 6
-
为什么你的网速像蜗牛爬?一文教你找出原因并轻松解决!详细阅读
你有没有经历过这样的场景?正在追剧时,视频突然卡住,加载圈转得比钟表还慢;或者在和朋友视频通话时,画面断断续续,声音像从另一个星球传来,这时候,你可能...
2026-04-09 7
