C语言常见经典面试题集锦(更新中)

准备下常见的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;
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值