1. 下面这段代码的输出是多少(在32位机上).
char *p;
char *q[20];
char *m[20][20];
int (*n)[10];
struct MyStruct
{
char dda;
double dda1;
int type ;
}; MyStruct k;
printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));
答案:4,80,1600,4,24
n是指向一维数组的指针变量;k中不要忘了考虑对齐问题,这里dda为4个字节。
2.
(1)
char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} }; for(int i=0;i<12;i++) printf("%d ",_______); 在空格处填上合适的语句,顺序打印出a中的数字
答案:a[i/6][(i/3)%2][i%3];这道题目是多维数组的输出问题,这里要考虑的是每维数字的取值顺序问题:第一维,前六次循环都取0,后六次取1,于是i/6可以满足要求;第二维,前3次为0,再3次为1,再3次为0,再3次为1,用量化的思想,i/3把12个数字分为4组每组3个,量化为0、1、2、3,为要得到0、1、0、1我们这里就需要对(0、1、2、3)%2=(0、1、0、1),于是(i/3)%2;最后一维我们需要的是(0、1、2;0、1、2;0、1、2;0、1、2;)我们就i%3。
(2)
昨天在网上看到这样一个问题:
char **p, a[16][8];
问:p=a是否会导致程序在以后出现问题?为什么?
答案:这个会导致出现问题: 不能将'char [16][8]'转化成‘char**’
也就是说a可以认为是char(*)[8]类型,a是指向数组的指针
可以改成这样 char (*p1)[8]=a,
但是要注意p的使用,如a[1][2] 等价的为 *(*(p+1)+2)而不是*(p+11)。
我是这样理解的:
对于一个多维数组:char a[m][n];可以认为它是 MYTYPE a[m];这里的
MYTYPE是char b[n];即:数组a由m 个含n元素的一维数组组成。我们理解a是一个数组变量,a中保存的是它的首元素的地址,而它的首元素是MYTYPE类型的a[0]也是一个数组,这样就是说,a中保存的地址所保存的内容是b(b是一个数组),那么a+1时跳过的就是一个数组(跳过a所存的地址所表示的变量的长度);而b中保存的是b的首元素地址,所以b+1时跳过的是b的一个元素。
3.用递归方式,非递归方式写函数将一个字符串反转.
函数原型如下:char *reverse(char *str);
答案:
非递归方式:
char *reverse(char *str) { int len = strlen(str); char temp; for(int i=0; i<len/2; i++) { temp = *(str+i); *(str+i) = *(str+len-1-i); *(str+len-1-i) = temp; } return str; }
递归方式:
#include <stdio.h> #include <string.h> void DoReversion(char *str, int cur, int length){ char temp; if (cur > length/2) { return; } DoReversion(str, cur+1, length); temp = str[cur]; str[cur] = str[length-cur-1]; str[length-cur-1] = temp; return; }
void Reversion(char *str){ int length ; if (str==NULL) { return; }
length = strlen(str); DoReversion(str, 0, length); }
int main(){ char a[]="abcdefg"; Reversion(a); return 0; }
4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?
答案:strcpy是字符串拷贝,遇 '\0' 则停。 memcpy是内存拷贝,要指定拷贝的长度。 当要拷贝二进制数据(比如说一个结构),只能用memcpy
5.写一个函数将一个链表逆序.
一个单链表,不知道长度,写一个函数快速找到中间节点的位置.
写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
答案:
把一个链表中的接点顺序倒排 typedef struct linknode { int data; struct linknode *next; }node; //将一个链表逆置 node *reverse(node *head) { node *p,*q,*r; p=head; q=p->next; while(q!=NULL) { r=q->next; q->next=p; p=q; q=r; }
head->next=NULL; head=p; return head; }
6.用递归算法判断数组a[N]是否为一个递增数组。
7.
有一个文件(名为a.txt)如下,每行有4项,第一项是他们的名次,写一个c程序,将五个人的名字打印出来.并按名次排序后将5行数据仍然保存到a.txt中.使文件按名次排列每行.
2,07010188,0711,李镇豪, 1,07010154,0421,陈亦良, 3,07010194,0312,凌瑞松, 4,07010209,0351,罗安祥, 5,07010237,0961,黄世传,
8.写一个函数,判断一个unsigned char 字符有几位是1.
写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian).
9.微软的笔试题.
Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).
Please do not use MFC, STL and other libraries in your implementation.
10.有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).
这十道题还是能够看出自己的水平如何的.如果你能不假思索地做出这10道题,估计去国外大公司是没有问题了,呵呵。。。