C語言大廠面試技巧及strcpy()函數示例詳解

1、什麼是優秀的代碼?

1. 代碼運行正常

2. bug很少

3. 效率高

4. 可讀性高

5. 可維護性高

6. 註釋清晰

7. 文檔齊全

2、常見的coding技巧有哪些?

1. 使用assert

2. 盡量使用const

3. 養成良好的編碼風格

4. 添加必要的註釋

5. 避免編碼的陷阱。

3、以模擬實現strcpy為例

(1)瞭解strcpy()函數

作用:將源字符串裡的字符拷貝到目標字符串中去。

註意:字符串的結束標志’\0’也會拷貝過去。

證明如下:

(2)正片開始(危)

1.第一階段(面試官:最多5分)

#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
	while (*src!='\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//處理字符串的結束標志'\0'
	//*dest = '\0';這樣處理並非是不行,但是會給閱讀代碼的造成一種錯覺\
	即這個'\0'是自己放進去的,而不是從源字符串拷貝進去的
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
 
   my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

缺點:如果傳的實參是空指針,就會出現問題,因為空指針是無法進行解引用的。

解決方法:使用assert()進行斷言,()裡面放的是表達式。使用assert需要引用頭文件<assert.h>。

說明:assert(),括號中的表達式如果不滿足,編譯器就會報錯。

2.第二階段(面試官:最多7分)

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest, char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
   //當然,此處也可以將兩個合並成一個:assert( dest && src )
	while (*src!='\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
 
   my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

下面是圖片演示,加入傳入一個空指針就會出現下面的報錯。

3.第三階段的代碼:(面試官:最多8分)

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest, char* src)
{
	assert( dest && src );
	while(*dest++ = *src++)//'\0'的ascii碼值為0,為假,會退出循環
	{
		;
	}
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
   my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

4.第四階段(面試官:完美代碼!10分!)

通過對比發現,與庫函數中的函數還相差一個const,以及返回類型不同。

#include<stdio.h>
#include<assert.h>
char * my_strcpy(char* dest, const char* src)
//const可以防止源字符串被改變
{
	assert( dest && src );
	char* ret = dest;
	while(*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
 
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

以上就是C語言面試技巧及strcpy()函數示例詳解的詳細內容,更多關於C語言面試技巧及strcpy()函數的資料請關註WalkonNet其它相關文章!

推薦閱讀: