|
C/C++程序员应聘常见面试题深入剖析
|
|
来源:www.100jq.com 作者: |
|
n=2,移位后应该是“hiabcdefgh”
函数头是这样的:
//pStr是指向以'\0'结尾的字符串的指针 //steps是要求移动的n
void LoopMove ( char * pStr, int steps ) { //请填充... } |
解答:
正确解答1:
void LoopMove ( char *pStr, int steps ) { int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = '\0'; strcpy( pStr, tmp ); } |
正确解答2:
void LoopMove ( char *pStr, int steps ) { int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); } |
剖析:
这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。
最频繁被使用的库函数包括:
(1) strcpy
(2) memcpy
(3) memset
试题6:已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。
WAVE文件格式说明表
|
|
偏移地址 |
字节数 |
数据类型 |
内 容 |
| 文件头
|
00H |
4 |
Char |
"RIFF"标志 |
| 04H |
4 |
int32 |
文件长度 |
| 08H |
4 |
Char |
"WAVE"标志 |
| 0CH |
4 |
Char |
"fmt"标志 |
| 10H |
4 |
|
过渡字节(不定) |
| 14H |
2 |
int16 |
格式类别 |
| 16H |
2 |
int16 |
通道数 |
| 18H |
2 |
int16 |
采样率(每秒样本数),表示每个通道的播放速度 |
| 1CH |
4 |
int32 |
波形音频数据传送速率 |
| 20H |
2 |
int16 |
数据块的调整数(按字节算的) |
| 22H |
2 |
|
每样本的数据位数 |
| 24H |
4 |
Char |
数据标记符"data" |
| 28H |
4 |
int32 |
语音数据的长度 |
解答:
将WAV文件格式定义为结构体WAVEFORMAT:
typedef struct tagWaveFormat { char cRiffFlag[4]; UIN32 nFileLen; char cWaveFlag[4]; char cFmtFlag[4]; char cTransition[4]; UIN16 nFormatTag ; UIN16 nChannels; UIN16 nSamplesPerSec; UIN32 nAvgBytesperSec; UIN16 nBlockAlign; UIN16 nBitNumPerSample; char cDataFlag[4]; UIN16 nAudioLength;
} WAVEFORMAT; |
假设WAV文件内容读出后存放在指针buffer开始的内存单元内,则分析文件格式的代码很简单,为:
WAVEFORMAT waveFormat; memcpy( &waveFormat, buffer,sizeof( WAVEFORMAT ) ); |
直接通过访问waveFormat的成员,就可以获得特定WAV文件的各项格式信息。
剖析:
试题6考查面试者组织数据结构的能力,有经验的程序设计者将属于一个整体的数据成员组织为一个结构体,利用指针类型转换,可以将memcpy、memset等函数直接用于结构体地址,进行结构体的整体操作。 透过这个题可以看出面试者的程序设计经验是否丰富。
试题7:编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:
class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 }; |
解答:
//普通构造函数
String::String(const char *str) { if(str==NULL) { m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空 //加分点:对m_data加NULL 判断 *m_data = '\0'; } else { int length = strlen(str); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, str); } }
// String的析构函数
String::~String(void) { delete [] m_data; // 或delete m_data; }
//拷贝构造函数
String::String(const String &other) // 得分点:输入参数为const型 { int length = strlen(other.m_data); m_data = new char[length+1]; //加分点:对m_data加NULL 判断 strcpy(m_data, other.m_data); }
//赋值函数
String & String::operate =(const String &other) // 得分点:输入参数为const型 { if(this == &other) //得分点:检查自赋值 return *this; delete [] m_data; //得分点:释放原有的内存资源 int length = strlen( other.m_data ); m_data = new char[length+1]; //加分点:对m_data加NULL 判断 strcpy( m_data, other.m_data ); return *this; //得分点:返回本对象的引用 } |
欢迎加入本站QQ群参与讨论
共5页: 上一页 [1] [2] [3] 4 [5] 下一页
|
| 上一篇:开机密码 下一篇:Linux常用基本命令及应用技巧 |
|
[ 收藏]
[ 推荐]
[ 评论(0条)]
[返回顶部] [打印本页]
[关闭窗口] |
|
|
| |
|
|
 |
|
相关信息 |
|
|
|
|
|