C++程序员笔试训练

作者 : admin 本文共3341个字,预计阅读时间需要9分钟 发布时间: 2024-06-17 共1人阅读

面试题1:使用库函数将数字转换位字符串

  • 考点:c语言库函数中数字转换位字符串的使用

C++程序员笔试训练插图

char *gcvt(double number, int ndigit, char *buf);

参数说明:

number:待转换的double类型数值。
ndigit:保留的小数位数。
buf:用于存储转换后的字符串的缓冲区。

  • 示例代码如下
void func()
{
	int numInt = 1333;
	double numDouble = 123.12;

	char strInt[20];
	char strDouble[20];
	char buffer[20];

	_itoa(numInt, strInt, 10);
	_gcvt(numDouble, 5, strDouble);

	sprintf(buffer, "%d", numInt);

	cout << strInt << endl;
	cout << strDouble << endl;
	cout << buffer << endl;

}

面试题2:不使用库函数将整数转换为字符串

  • 考点:对数字转换为字符串,相关ASCII码的理解

解题思路:将整数的每一位上加上’0’转换成char类型并存到字符数组中

void func()
{
	int number = 12333;

	char str[20];
	int count = 0;
	while (number)
	{
		int num = number % 10;
		str[count++] = num + '0';
		number = number / 10;
	}
	//对顺序进行调整
	char newstr[20];
	for (int i = 0; i < count; i++)
	{
		newstr[i] = str[count - 1 - i];
	}
	newstr[count] = '
void func()
{
int number = 12333;
char str[20];
int count = 0;
while (number)
{
int num = number % 10;
str[count++] = num + '0';
number = number / 10;
}
//对顺序进行调整
char newstr[20];
for (int i = 0; i < count; i++)
{
newstr[i] = str[count - 1 - i];
}
newstr[count] = '\0';
cout << newstr << endl;
}
'
; cout << newstr << endl; }

面试题3:编程实现strcpy函数

  • 考点:字符串复制的实现
    C++程序员笔试训练插图(1)
  • 示例代码如下
char* My_strcpy(char* strDest, const char* strSrc)
{
	
	int strSrc_len=strlen(strSrc);
	
	for (int i = 0; i < strSrc_len; i++)
	{
		strDest[i] = strSrc[i];
	}
	strDest[strSrc_len] = '
char* My_strcpy(char* strDest, const char* strSrc)
{
int strSrc_len=strlen(strSrc);
for (int i = 0; i < strSrc_len; i++)
{
strDest[i] = strSrc[i];
}
strDest[strSrc_len] = '\0';
return strDest;
}
int getStrLen(const char* strSrc)
{
int len = 0;
while (*strSrc++ != '\0')
{
len++;
}
return len;
}
int main()
{
char strSrc[] = "abcdefg";
char strDest[20];
int len = 0;
len=getStrLen( My_strcpy(strDest, strSrc));
cout << strDest << endl;
cout << "len=" << len << endl;
system("pause");
return 0;
}
'
; return strDest; } int getStrLen(const char* strSrc) { int len = 0; while (*strSrc++ != '
char* My_strcpy(char* strDest, const char* strSrc)
{
int strSrc_len=strlen(strSrc);
for (int i = 0; i < strSrc_len; i++)
{
strDest[i] = strSrc[i];
}
strDest[strSrc_len] = '\0';
return strDest;
}
int getStrLen(const char* strSrc)
{
int len = 0;
while (*strSrc++ != '\0')
{
len++;
}
return len;
}
int main()
{
char strSrc[] = "abcdefg";
char strDest[20];
int len = 0;
len=getStrLen( My_strcpy(strDest, strSrc));
cout << strDest << endl;
cout << "len=" << len << endl;
system("pause");
return 0;
}
'
) { len++; } return len; } int main() { char strSrc[] = "abcdefg"; char strDest[20]; int len = 0; len=getStrLen( My_strcpy(strDest, strSrc)); cout << strDest << endl; cout << "len=" << len << endl; system("pause"); return 0; }

C++程序员笔试训练插图(2)

面试题4:编程实现memcpy函数

  • 内存复制的实现
void *memcpy(void *dest, const void *src, size_t n);

其中,dest是目标地址,src是源地址,n是要复制的字节数。

memcpy函数可以用来复制任意长度的内存数据,但注意对于复杂数据类型(如结构体、类等),要确保其成员的内存布局是连续的,否则可能会导致数据被破坏。

  • 示例代码如下
void* memcpy2(void *dest,const void *src,size_t size)
{
	assert((dest != NULL) && (src != NULL));

	//强制转换
	char* newDest = (char*)dest;
	char* newSrc = (char*)src;
	
	while (size-- > 0)
	{
		*newDest++ = *newSrc++;
	}

	return newDest;
}


int main()
{

	char src[] = "asdfghjk";
	char dest[20];
	int len=strlen(src);
	memcpy2(dest, src, len);
	dest[len] = '
void* memcpy2(void *dest,const void *src,size_t size)
{
assert((dest != NULL) && (src != NULL));
//强制转换
char* newDest = (char*)dest;
char* newSrc = (char*)src;
while (size-- > 0)
{
*newDest++ = *newSrc++;
}
return newDest;
}
int main()
{
char src[] = "asdfghjk";
char dest[20];
int len=strlen(src);
memcpy2(dest, src, len);
dest[len] = '\0';
cout << dest << endl;
system("pause");
return 0;
}
'
; cout << dest << endl; system("pause"); return 0; }

面试题5:strcpy与memcpy的区别

  • strcpy和memcpy都是用来复制内存区域的函数,但是二者之间有几个关键的区别:
  1. strcpy用于复制字符串,其原型为char* strcpy(char* dest, const char* src)。它会从源字符串的地址开始复制字符,直到遇到空字符\0为止。因此,strcpy只能用来复制字符串,并且不需要指定复制的长度。

  2. memcpy用于复制任意类型的内存数据,其原型为void* memcpy(void* dest, const void* src, size_t n)。它需要传入要复制的数据的起始地址和长度,可以复制任意类型的数据,包括字符串。因此,memcpy是更通用的函数,可以处理任意类型的数据。

  3. strcpy会在目标字符串的末尾添加\0结束符,而memcpy则不会。因此,在使用memcpy复制字符串时,需要手动添加结束符。

  • 总的来说,strcpy主要用于复制字符串,而memcpy用于复制任意类型的内存数据。在复制字符串时,可以使用strcpy来保证字符串的正确复制及添加结束符。

面试题6:编程实现字符串的长度

  • 考点:strcpy库函数的实现细节

解题思路:以字符串的结束符’\0’作为标志,做一次遍历即可

int strlen1(const char*str)
{
	assert(NULL != str);
	int len = 0;
	while (*str++ != '
int strlen1(const char*str)
{
assert(NULL != str);
int len = 0;
while (*str++ != '\0')
{
len++;
}
return len;
}
int strlen2(const char* str)
{
assert(str != NULL);
const char* temp = str;
while (*str++ != '\0');
return str - temp - 1;
}
int main()
{
char str[] = "asdfghjkl";
//const char* str = NULL;
cout << "len1=" << strlen1(str) << endl;
cout << "len2=" << strlen2(str) << endl;
system("pause");
return 0;
}
'
) { len++; } return len; } int strlen2(const char* str) { assert(str != NULL); const char* temp = str; while (*str++ != '
int strlen1(const char*str)
{
assert(NULL != str);
int len = 0;
while (*str++ != '\0')
{
len++;
}
return len;
}
int strlen2(const char* str)
{
assert(str != NULL);
const char* temp = str;
while (*str++ != '\0');
return str - temp - 1;
}
int main()
{
char str[] = "asdfghjkl";
//const char* str = NULL;
cout << "len1=" << strlen1(str) << endl;
cout << "len2=" << strlen2(str) << endl;
system("pause");
return 0;
}
'
); return str - temp - 1; } int main() { char str[] = "asdfghjkl"; //const char* str = NULL; cout << "len1=" << strlen1(str) << endl; cout << "len2=" << strlen2(str) << endl; system("pause"); return 0; }

在这个函数中,temp是一个指向字符串开头的常量字符指针,而str是一个指向字符串结尾的字符指针(指向空字符’\0’的位置)。

当str逐个递增直到遇到空字符’\0’时,str指针的位置就指向了字符串的结尾。然后,通过计算str – temp可以得到字符串的长度,但是由于字符串的长度不包括空字符’\0’本身,所以需要减去1才能得到正确的长度。
因此,str – temp – 1的结果是字符串的实际长度,去除了末尾的空字符’\0’。

  • 重点:strlen2的效率是高于strlen1的,strlen1每次循环自增两次,而strlen2每次循环自增一次。

面试题7:编程实现字符串中子串的查找

  • 考点:strstr库函数的实现细节

请写一个函数,实现strstr,即从一个字符串中,查找另一个字符串的位置,如strstr(“12345”,“34”)返回值是2号位置找到字符串34

char *strstr(const char *haystack,const char *needle);
strstr()会从字符串 haystack 中搜寻字符串 needle,并将第一次出现的地址返回。

  • 解题思路:暴力解,直接从首字母开始遍历
char* my_strstr(const char* haystack, const char* needle)
{
	
	while (*haystack!='
char* my_strstr(const char* haystack, const char* needle)
{
while (*haystack!='\0')
{
char* stack = (char*) haystack;
char* need  = (char*) needle;
while (*stack++ == *need++)
{
if (*need!='\0')
{
return (char*)haystack;
}
}
haystack++;
}
return (char*)haystack;
}
int main()
{
char str1[] = "12345";
char str2[] = "34";
cout << "dest=" << my_strstr(str1, str2);
system("pause");
return 0;
}
'
) { char* stack = (char*) haystack; char* need = (char*) needle; while (*stack++ == *need++) { if (*need!='
char* my_strstr(const char* haystack, const char* needle)
{
while (*haystack!='\0')
{
char* stack = (char*) haystack;
char* need  = (char*) needle;
while (*stack++ == *need++)
{
if (*need!='\0')
{
return (char*)haystack;
}
}
haystack++;
}
return (char*)haystack;
}
int main()
{
char str1[] = "12345";
char str2[] = "34";
cout << "dest=" << my_strstr(str1, str2);
system("pause");
return 0;
}
'
) { return (char*)haystack; } } haystack++; } return (char*)haystack; } int main() { char str1[] = "12345"; char str2[] = "34"; cout << "dest=" << my_strstr(str1, str2); system("pause"); return 0; }
本站无任何商业行为
个人在线分享 » C++程序员笔试训练
E-->