数组越界
面试例题41:下面的程序有何缺点?
#define MAX 255
int main()
{
unsigned char A[MAX],i;
for(i = 0; i <= MAX;i++)
{
A[i] = i;
}
return 0;
}
解析:典型的数组越界问题。For循环执行了256次,而数组A只有255个元素。
答案:将循环控制条件i <= MAX 改为 i < MAX即可。
面试例题42:找出下面程序的错误,并解释它为什么是错的。
void test1()
{
char string[10];
char* str1 = “0123456789”;
strcpy(string,str1);
std::cout << string << ‘\n’;
}
void test2()
{
char string[10],str1[10];
for(int i = 0; i < 10; i++)
{
str1[i] = ‘a’;
}
strcpy(string,str1);
std::cout << string << ‘\n’;
}
void test3(char* str1)
{
char string[10];
if(strlen(str1) <= 10)
{
strcpy(string, str1);
}
std::cout << string << ‘\n’;
}
解析:字符数组和strcpy问题。
字符数组并不要求最后一个字符为’\0’。是否需要加入’\0’,完全由系统需要决定。但是字符数组的初始化要求最后一个字符必须为’\0’,所以test1会报错,test2虽然能够编译通过,但是会出现运行时错误。类似于char c[5] = {‘C’, ‘h’, ‘i’, ‘n’, ‘a’}这样的定义是错误的。 是正确的,但不能用于字符串的赋值操作。
答案:
void test1()
{
char string[10];
char* str1 = “012345678”;//错误1
strcpy(string,str1);
std::cout << string << ‘\n’;
}
void test2()
{
char string[10],str1[10];
for(int i = 0; i < 9; i++) //错误2
{
str1[i] = ‘a’;
}
Str1[9] = ‘\0’;
strcpy(string,str1);
std::cout << string << ‘\n’;
}
void test3(char* str1)
{
char string[10];
if(strlen(str1) <= 10)
{
strcpy(string, str1);
}
std::cout << string << ‘\n’;
}
int main()
{
test1();
test2();
char* str = “012345678”;//错误3
test3(str);
return 0;
}
面试例题43:下面语句的输出是什么
char a = 256;
int d = a;
printf("%d", d+1);
A. -1 B. 1 C.257 D. 0
解析:char数值溢出问题。Char类型的变量赋值范围是0~255.当把256赋值给a后,超出了a的有效取值范围,此时a的实际值为0.
**//TODO//
答案:B。
数字流和数组声明
面试例题44:下面哪一个不是标准输入输出通道?
A. Std::cin B. std::cout C. std::cerr D. stream
解析:I/Ostream问题。头文件iostream中含有cin、cout、cerr几个对象,对应于标准输入流、标准输出流和标准错误流。
答案:D。
面试例题45:下面哪个数组的声明是正确的?
A. int a[]; B. int n = 10, a[n] C. int a[10 + 1] = {0}; D. int a[3] = {1,2,3,4};
解析:数组定义问题。
a[n],n必须是常理值。
int a[]是错误的,不允许建立空数组。
int a[3] = {1,2,3,4};会造成越界问题,因此不允许。
答案:B ,C。
字符串其他问题
面试例题46:输入一个数,测试其是否是回文数。
解析:建立数组,按位存储。比较首位和末位是否相同。如不同,则不是回文数。相同则继续比较,首位递增,末位递减,直到首位不再是小于末位。
答案:完整代码如下
#include<iostream>
using namespace std;
int main()
{
int j = 10, k = 12321, p,a[10], ss, i = 0, begin , end;
cout << “please input” << endl;
cin >> k;
p = k;
while(p)
{
ss = p % 10;
a[i] = ss;
p = p /10;
i++;
}
begin = 0;
end = i -1;
while(begin < end)
{
if(a[begin] != a[end])
{
Break;
}
else
{
begin++;
end--;
}
}
if(begin < end)
{
cout<< “false” << endl;
}
else
{
cout<< “true” << endl;
}
cout << “i” << i << endl;
cout << k;
retrurn 0;
}
自己写的↓
bool isPalindrome(int num){
//数字转字符串
if (num < 0){
return false;
}
vector<int> tranStr;
while (num > 0){
int temp = num % 10;
tranStr.push_back(temp );
num /= 10;
}
auto start = tranStr.begin();
auto end = tranStr.end() - 1;
while (start < end){
if (*start != *end){
return false;
}
++start;
--end;
}
return true;
}
面试例题47:将字符串“askdaskaskdaskg”删除指定字符ask,删除后的结构是“ddg”。
解析:删除的最好办法就是把不删除的东西提取出来。
答案:完整代码如下
#include<stdio.h>
#include<string>
#include<conio.h>
int main()
{
char uu[20];
char *des= "ask", *source= "askdaskaskdas";
char *p,*str2;
int n = 0, i = 0, v;
p = des;
str2 = str;
while(*str2)
{
while(*p)
{
if(*p == *str2)
{
break;
}
p++;
}
if(*p == ‘\0’)
{
uu[i] = *str2;
i++;
}
str2++;
p = sub;
}
uu[i] = 0;
str = uu;
printf(“\n %s”,str);
return 0;
}
面试例题48:请写一个函数来模拟C++中的strstr()函数:该函数的返回值是主串中字符子串的位置以后的所有字符。请不要使用任何C程序已有的函数来完成。
解析:string字符串问题。做一个程序模拟C++中的strstr()函数。Strstr()函数是把主串中子串及以后的字符全部返回。比如主串是“12345678”,子串是“234”,那么函数的返回值就是“2345678”。
答案:正确程序如下
#include<iostream>
using namespace std;
const char* strstr1(const char* string, const char* strCharSet)
{
for (int i = 0; string[i] != '\0'; i++)
{
//子串的下标
int j = 0;
int temp = i;
if (string[temp] == strCharSet[j])
{
while (string[temp++] == strCharSet[j++])
{
if ((strCharSet[j] == '\0'))
{
return &string[i];
}
}
}
}
return nullptr;
}
int main()
{
char* string = "12345554555123";
cout << string << endl;
char strCharSet[10] = {};
cin >> strCharSet;
cout << strstr1(string, strCharSet) << endl;
system("pause");
return 0;
}
面试例题49:将一句话里的单词进行倒置,标点符号不倒换。比如一句话“i come from XiaMen”倒换后变成“XiaMen from come i”
解析:解决该问题可以分为两步:第一步全盘置换将该句变成,第二步进行部分翻转,如果不是空格,则开始翻转单词。
答案:具体代码如下
#include<iostream>
#include<stdio.h>
int main(void)
{
int num = -12345, j = 0, i = 0, flag = 0, begin, end;
char str[] = “i come from XiaMen”;
char temp;
j = strlen(str) - 1;
printf(“string = %s\n”, str);
//进行全部翻转
while(j > i)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
j--;
i++;
}
printf(“string = %s\n”, str);
i = 0;
//对单独的单词进行翻转
while(str[i])
{
if(str[i] != ' ')
{
begin = i;
while(str[i] && str[++i] != ‘ ’)
{
}
i = i - 1;
end = i;
}
while(end > begin)
{
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
end--;
begin++;
}
i++;
}
printf(“string = %s\n”, str);
return 0;
}
面试例题50:有100个整数,其中有负数,找出连续3个数之和最大的部分。
答案:完整代码如下
#include<iostream>
using namespace std;
int main()
{
int a[10] = {-3,4,6,8,-9,7,10,-6,20,-9}
int sum = a[0]+a[1]+a[2]-1, index, i;
for(i = 0; i <= 7; i++)
{
if(sum < a[i] + a[i + 1] + a[i + 2])
{
sum = a[i] + a[i + 1] + a[i + 2];
index = i + 1;
}
}
cout << “\n this is at the” << index << “3 number the sum is largest”;
return 0;
}