目录
面试题2:不使用库函数将整数转换成字符串 出现频率:*****
面试题4:不使用库函数将字符串转换为数字 出现频率:****
面试题7:strcpy与memcpy的区别 出现频率:****
面试题12:编程实现字符串中子串的查找 出现频率:*****
例:strstr("12345","34")返回值为2,在2号位置找到字符串34
例:"I am from Shanghai"倒置为"Shanghai from am I“
面试题15:编程实现strcmp库函数 出现频率:*****
面试题16:编程查找两个字符串的最大公共子串 出现频率:***
例:两个字符串A="aocdfe",B="pmcdfa",输出结果“cdf”
面试题17:不使用printf,将十进制数以二进制和十六进制的形式输出 出现频率:***
面试题18:编程实现转换字符串、插入字符的个数 出现频率:****
面试题20:反转字符串,但其指定的子串不反转 出现频率:***
面试题22:编程实现任意长度的两个正整数相加 出现频率:****
例:"abcdefghi",如果n=2,移位后应该"hiabcdefg"
面试题26:编程实现删除字符串中所有指定的字符 出现频率:****
面试题27:分析代码----使用strcat连接字符串 出现频率:***
面试题28:编程实现库函数strcat 出现频率:*****
面试题1:使用库函数将数字转换为字符串
考点:c语言库函数中数字转换为字符串的使用
出现频率:***
解析:
itoa 将整型值转换为字符串
ltoa 将长整型值转换为字符串
ultoa 将无符号长整型值转换为字符串
gcvt 将浮点型数转换为字符串,取四舍五入
ecvt 将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点
fcvt 以指定位数为转换精度,其余同ecvt
答案:可以使用atoi系列的函数将数字转换为字符串
面试题2:不使用库函数将整数转换成字符串
考点:对数字转换为字符串,相关ASCII码的理解
出现频率:*****
答案:
void int2str(int n, char *str)
{
char buf[10] = "";
int i = 0;
int len = 0;
int temp = n < 0 ? -n:n;
if(NULL == str)
{
return;
}
while(temp)
{
buf[i++] = (temp % 10) + '0';
temp = temp / 10;
}
len = n < 0 ? ++i : i; //如果n是负数,则多需要一位来存储负号
str[i] = 0;
while(1)
{
i--;
if(buf[len-i-1] == 0)
{
break;
}
str[i] = buf[len-i-1];
}
if(0 == i)
{
str[i] = '-';
}
}
int main()
{
int nNum;
char p[10];
cout << "please input an integer:";
cin >> nNum;
cout << "output:";
int2str(nNum, p);
cout << p << endl;
return 0;
}
面试题3:使用库函数将字符串转换为数字
考点:c语言库函数中字符串转换为数字的使用
出现频率:****
解析:
atof 将字符串转换为双精度浮点型值
atoi 将字符串转化为整型值
atol 将字符串转换为长整型值
strtod 将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字
strtol 将字符串转换为长整型值,并报告不能被转换的所有剩余数字
strtoul 将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字
面试题4:不使用库函数将字符串转换为数字
考点:对字符串转换为数字,相关ASCII码的理解
出现频率:****
答案:
int str2int(const char *str)
{
int temp = 0;
const char *ptr = str;
if(*str == '-' || *str == '+')
{
str++; //如果第一个字符是正负号,则移到下一个字符
}
while(*str != 0)
{
if((*str < '0') || (*str > '9'))
{
break;
}
temp = temp * 10 + (*str-'0');
str++;
}
if(*ptr == '-')
{
temp = -temp;
}
return -temp;
}
int main()
{
int n = 0;
char p[10] = "";
cin.getline(p, 20); //从终端获取一个字符串
n = str2int(p); //把字符串转换为整型数
cout << n << endl;
return 0;
}
面试题5:编程实现strcpy函数
考点:字符串复制的实现
出现频率:****
已知strcpy函数的原型是:
char *strcpy(char *strDest, const char *srtSrc);
(1)不调用库函数,实现strcpy函数
(2)解释为什么要返回char *
答案:
char *strcpy(char *strDest, const char *strSrc)
{
if(strDest == NULL || strSrc == NULL)
{
return NULL;
}
char *strDestCopy = strDest;
while((*strDest++ = *strSrc++) != '\0');
return strDestCopy;
}
int getStrLen(const char *strSrc)
{
int len = 0;
while(*strSrc++ != '\0')
{
len++;
}
return len;
}
int main()
{
char strSrc[] = "hello world!";
char strDest[20];
int len = 0;
len = getStrlen(strcpy(strDest, strSrc));
printf("strDest:%s\n, strDest);
printf("Length of strDest:%d\n", len);
return 0;
}
为什么返回值是char *,是为了使用链式表达式,由于在strcpy中使用了char *返回类型,因此
可以在代码中可以通过链式表达式来同时做两个操作,这样不仅调用方便,而且程序结构简洁明了。
面试题6:编程实现memcpy函数
考点:内存复制的实现
出现频率:****
答案:
#include <assert.h>
void *memcpy2(void *memTo, const void *memFrom, size_t size)
{
assert((memTo != NULL) && (memFrom != NULL)); //memTo和memFrom必须有效
char *tempFrom = (char *)memFrom;
char *tempTo = (char *)memTo;
while(size-- > 0)
{
*tempTo++ = *tempFrom++;
}
*tempTo = '\0';
return memTo;
}
面试题7:strcpy与memcpy的区别
考点:字符串复制与内存复制之间的区别
出现频率:****
答案:
1、复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、
整型、结构体等
2、复制的方法不同,strcpy不需要指定长度,它是遇到字符串结束符'\0'而结束的,而memcpy
则是根据其第三个参数决定复制的长度
3、用途不同,通常在复制字符串时用strcpy,而若需要复制其他类型数据,则一般用memcpy
面试题8:改错----数组越界
考点:数组越界出现的问题
出现频率:****
试题1:
void test1()
{
char string[10];
char *str1 = "0123456789";
strcpy(string, str1);
}
试题2:
void test2()
{
char string[10], str1[10];
int i;
for(i = 0; i < 10; i++)
{
str1[i] = 'a';
}
strcpy(string, str1);
}
试题3:
void test3(char *str1)
{
char string[10];
if(strlen(str1) <= 10)
{
strcpy(string, str1);
}
}
答案:这三道题都有数组越界的问题
试题1:
void test1()
{
char string[10]; //改成:char string[11];
char *str1 = "0123456789";
strcpy(string, str1);
}
试题2:
void test2()
{
char string[10], str1[10]; //改成:char string[11], str1[11];
int i;
for(i = 0; i < 10; i++)
{
str1[i] = 'a';
}
strcpy(string, str1);
}
试题3:
void test3(char *str1)
{
char string[10];
if(strlen(str1) <= 10) //改成:if(strlen(str1) < 10)
{
strcpy(string, str1);
}
}
面试题9:分析程序---数组越界
考点:不当的循环操作导致数组越界
出现频率:***
下面这个程序执行后会出现什么错误或者效果
#define MAX 255
int main()
{
unsigned char A[MAX