准备下常见的C语言面试题,一般都是些经典的C程序(诸如strcmp, strcpy, atoi...),觉得把这些零碎题都集锦下,方便以后复习或者用到。题目是其次,关键是思路。
数字 / 字符转换
字符转数字,这个是百度百科上的实现,个人觉得很简短了,就此贴上:
void atoi(const char *str)
{
int neg_flag = 0;
int res = 0;
if (NULL == str)
{
return;
}
if (str[0] == '+' || str[0] == '-')
{
neg_flag = (*str++ == '+');
}
while (isdigit(*str))
{
res = res*10 + (*str++)
}
return (neg_flag)? (0 - res) : res;
}
个人实现的数字转字符:
void myitoa(int num, char *str)
{
char *head = NULL;
char *curr = NULL;
char temp;
// 入参检查
head = str;
curr = str;
if (num < 0)
{
*curr++ = '-';
num = 0 - num;
}
/* 整数转化为字符串 */
while (num)
{
*curr++ = num%10 + '0';
num = num / 10;
}
/* 除'-'号外,转换的字符串逆序 */
if (*head == '-')
{
head = str+1;
}
--curr;
while (head <= curr)
{
temp = *curr;
*curr = *head;
*head = temp;
head++;
curr--;
}
}
字符串类
不用任何变量编写strlen函数。很早之前看到的,印象很深,觉得特别经典,必须记录:
int mystrlen(const char *str)
{
// 入参检查
return ('\0' == *str)? (1 + my_strlen(++str)): 0;
}
接下来两个strcpy和strcmp:
int mystrcmp(const char *strA, const char *strB)
{
// 入参检查
while ('\0' != *strA && '\0' != *strB && *strA == *strB)
{
strA++;
strB++;
}
return *strA - *strB;
}
char* mystrcpy(char *DestStr, const char *SrcStr)
{
char *temp = NULL;
// 入参检查
temp = DestStr;
while ('\0' != (*DestStr++ = *SrcStr++);
return temp;
}
memcpy实现:
void *memcpy(void *dest, const void *src, size_t count)
{
//入参检查
char *temp1 = (char *)dest;
const char *temp2 = (const char *)src;
while (count--)
{
*temp1++ = *temp2++;
}
return dest;
}
求最长公共子串及长度:
/* 求公共最长子串及长度 */
#define MAX 100
/* 记录比较结果 */
int record[MAX][MAX];
int comsubstr(const char *strA, const char *strB, int lanA, int lanB)
{
int i, j;
int index = 0;
int maxlan = 0;
for (i = 0; i < lanA; i++)
{
for (j = 0; j < lanB; j++)
{
if (strA[i] == strB[j])
{
record[i][j] = record[i-1][j-1] + 1; // 最长长度方程 record[i][j] = record[i-1][j-1] + 1; strA[i] == strB[j]
if (record[i][j] > maxlan) // = 0; others
{
maxlan = record[i][j];
index = i - maxlan + 1;
}
}
else
{
record[i][j] = 0;
}
}
}
// 知道最长子串在A中下标及长度,结果就出来了
printf("%c ", strA[index]);
printf("%d ", maxlan);
return maxlan;
}