上網搜索一些好的C筆試題,收藏了,感謝原作者:
2. strcpy的寫法:
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
//[1]
throw "Invalid argument(s)";
//[2]
char * strDestCopy=strDest;
//[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != '\0' ) // 2分只有當*ch1 = '\0'的時候纔會退出循環
NULL ;
return address ; // 2分
}
strcpy能把strSrc的內容複製到strDest,爲什麼還要char * 類型的返回值?
答:爲了實現鏈式表達式。 // 2分
例如 int length = strlen( strcpy( strDest, “hello world”) );
char* strcpy1(char *strDest, const char* strSrc)
{
assert(strSrc != NULL );
assert(strDest != NULL);
int i;
char *address = strDest;
for(i = 0; strSrc[i] != '\0'; i++)
strDest[i] = strSrc[i];
strDest[i] = '\0';
return address;
}
3. strcpy的寫法:
(1) strlen和sizeof的區別
sizeof(...)是運算符, 在頭文件中typedef爲unsigned int,其值在編譯時即計算好了,參數可以是數組、指針、類型、對象、函數等。strlen(...)是函數,要在運行時才能計算。參數必須是字符型指針(char*), 且必須是以'\0'結尾的。
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
附1: 複製時大小注意!
// String的普通構造函數
String::String(const char *str) // 6分
{
if(str==NULL)
{
m_data = new char[1]; // 若能加 NULL 判斷則更好
*m_data = ‘ 0’;
}
else
{
int length = strlen(str);
// char *m_data;
m_data = new char[length+1]; // 若能加 NULL 判斷則更好
strcpy(m_data, str);
}
}
4. memcpy的寫法
(1) 筆試題02-自己實現memcpy
void *myMemCopy(void *dest,const void *src,size_t count)
{
char *pDest=(char *)(dest);
const char *pSrc=(const char *)(src);
//目的地址和源地址重疊,從源地址的末尾方向開始拷貝
if( pDest>pSrc && pDest<pSrc+count )
{
pDest = pDest + count-1;
pSrc = pSrc + count-1;
while(count--){
*pDest-- = *pSrc--;
}
}
//目的地址和源地址不重疊,從源地址的開始方向拷貝
else
{
while(count--){
*pDest++ = *pSrc++;
}
}
return pDest;
}
(2) 【面試題】實現memcpy函數