96.
struct name1{
? char str;
? short x;
? int? num;
}
struct name2{
? char str;0
1 2 3
? int num; 4 5 6 7
? short x; 8 9
?? ? ? ? ? 10 11
}
sizeof(struct name1)=?
sizeof(struct name2)=?
8、12
97. 讀文件file1.txt的內容(例如):
12
34
56
輸出到file2.txt:
56
34
12
(逆序)
2)輸出和為一個給定整數的所有組合
例如n=5
5=1+4;5=2+3(相加的數不能重復)
則輸出
1,4;2,3。
注意可增長數組的應用.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int MAX = 10;
int *a = (int *)malloc(MAX * sizeof(int));
int *b;
? ?
FILE *fp1;
FILE *fp2;
fp1 = fopen("a.txt","r");標準庫提供
(Open 操作系統提供)
if(fp1 == NULL)
{printf("error1");
?? ? ? exit(-1);
}
? ? fp2 = fopen("b.txt","w");
if(fp2 == NULL)
{printf("error2");
?? ? ? exit(-1);
}
int i = 0;
? ? int j = 0;
while(fscanf(fp1,"%d",&a[i]) != EOF)
{
i++;
j++;
if(i >= MAX)
{
MAX = 2 * MAX;
b = (int*)realloc(a,MAX * sizeof(int));
if(b == NULL)
{?
printf("error3");
exit(-1);
}
a = b;
}
}
for(;--j >= 0;)
?? ? ? fprintf(fp2,"%d\n",a[j]);
fclose(fp1);
fclose(fp2);
return 0;
}
98. 一個遞歸反向輸出字符串的例子,經典例程.
void inverse(char *p)
{
?? if( *p = = '\0' )?
return;
?? inverse( p+1 );
?? printf( "%c", *p );
}
int main(int argc, char *argv[])
{
?? inverse("abc\0");
? ? return 0;
}
99. 用遞歸算法判斷數組a[N]是否為一個遞增數組。
遞歸的方法,記錄當前最大的,并且判斷當前的是否比這個還大,大則繼續,否則返回false結束:
bool fun( int a[], int n )
{
if( n= =1 )
return true;
if( n == 2 )
return a[n-1] >= a[n-2];
return ( a[n-1] >= a[n-2] ) && fun( a,n-1);
}
a[5] = {0,1,2,3,4}
1.fun(a,5)
4.fun(a,4)
3.fun(a,3)
4.fun(a,2)
100. 什么是可重入性?
可重入(reentrant)函數可以由多于一個任務并發使用,而不必擔心數據錯誤。相反,不可重入(non-reentrant)函數不能由超過一個任務所共享,除非能確保函數的互斥(或者使用信號量,或者在代碼的關鍵部分禁用中斷)。可重入函數可以在任意時刻被中斷,稍后再繼續運行,不會丟失數據。可重入函數要么使用本地變量,要么在使用全局變量時保護自己的數據。
可重入函數:
不為連續的調用持有靜態數據。
不返回指向靜態數據的指針;所有數據都由函數的調用者提供。
使用本地數據,或者通過制作全局數據的本地拷貝來保護全局數據。
如果必須訪問全局變量,記住利用互斥信號量來保護全局變量。
絕不調用任何不可重入函數。
101. 給出下列程序的結果:
char str1[] = "abc";?
char str2[] = "abc";?
const char str3[] = "abc";?
const char str4[] = "abc";?
const char *str5 = "abc";?
const char *str6 = "abc";?
char *str7 = "abc";?
char *str8 = "abc";?
cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl;?
結果是:0 0 1 1 str1,str2,str3,str4是數組變量,它們有各自的內存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區域。?
102. 以下代碼中的兩個sizeof用法有問題嗎??
void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母?
{ ? ?
for( size_t i=0; i <sizeof(str)/sizeof(str[0]); ++i ) ? ? ? ?
if( 'a' <=str[i] && str[i] <='z' ) ? ? ? ? ? ?
str[i] -= ('a'-'A' );
}?
char str[] = "aBcDe";
cout < < "str字符長度為: " < < sizeof(str)/sizeof(str[0]) < < endl;?
UpperCase( str );
cout < < str < < endl;?
答案:函數外的str是一個靜態定義的數組,因此其大小為6,因為還有'\0',
函數內的sizeof(str)返回4。
103. 一個32位的機器,該機器的指針是多少位答案:?
指針是多少位只要看地址總線的位數就行了。80386以后的機子和ARM都是32的數據總線。所以指針的位數就是4個字節了。?
104. 請問以下代碼有什么問題:
int? main()
{
?char a; a 是一個字節
?char *str=&a;
?strcpy(str,"hello");
?printf(str);?
return 0;?
}?
答案:沒有為str分配內存空間,將會發生異常問題出在將一個字符串復制進一個字符變量指針所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程序崩潰。?
105. int (*s[10])(int) 表示的是什么啊?(右結合)
答案:int (*s[10])(int) 函數指針數組,每個指針指向一個int func(int param)的函數。?
106. 有以下表達式:?
int a=248; ?
int b=4;?
int const c=21; ?
const int *d=&a; ?
int *const e=&b; ?
int const *f const =&a;?
請問下列表達式哪些會被編譯器禁止?為什么? *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;?
答案:
*c 這是個什么東東,禁止;
*d 說了是const, 禁止;
e = &a 說了是const , 禁止;
const *f const =&a; 禁止?
107.c和c++中的struct有什么不同?
答案:c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而class默認為private?
108.類的靜態成員和非靜態成員有何區別?
答案:類的靜態成員每個類只有一個,非靜態成員每個對象一個?
109.純虛函數如何定義?使用時應注意什么?
答案:virtual void f()=0; 是接口,子類必須要實現?
110.
int main() ? ?
{
int x=3;
printf("%d",x); ? ?
return 1; ? ? ?
}?
問函數既然不會被其它函數調用,為什么要返回1?
答案:mian中,c標準認為0表示成功,非0表示錯誤。具體的值是某中具體出錯信息?
111. 已知一個數組table,用一個宏定義,求出數據的元素個數’
答案:
?#define NTBL (sizeof(table)/sizeof(table[0]))?
112. -1,2,7,28,,126請問28和126中間那個數是什么?為什么?
答案:答案應該是4^3-1=63 規律是n^3-1(當n為偶數0,2,4)? ? ? n^3+1(當n為奇數1,3,5)?
113.直接鏈接兩個信令點的一組鏈路稱作什么??
答案:PPP點到點連接?
114. 確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成的??
答案:概要設計階段?
★115.
enum string? ? {? ? x1,? ? x2,? ? x3=10,? ? x4,? ? x5,? ? }x; ? ?
問x的取值是?
答案:取值在0。1。10。11。12中的一個?
★116.
unsigned char *p1; ? ?
unsigned long *p2; ? ?
p1=(unsigned char *)0x801000; ? ?
p2=(unsigned long *)0x810000; ? ?
請問p1+5=? ;? ? ? ? p2+5=? ;?
答案:801005;810014。不要忘記了這個是16進制的數字,p2要加20變為16進制就是14?
: ?
117. Ethternet鏈接到Internet用到以下那個協議?? ? ? ? B ?
A.HDLC; B.ARP; C.UDP; D.TCP; E.ID ?
118.屬于網絡層協議的是:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? B.C?
A.TCP; B.IP傳輸層; C.ICMP; D.X.25 ?
119. Windows消息調度機制是:? ? ? C ?
A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;?
120.請問下面程序有什么錯誤? ? ?
int a[60][250][1000],i,j,k; ? ?
for(k=0;k <=1000;k++) ? ?
for(j=0;j <250;j++) ? ? ?
for(i=0;i <60;i++) ? ? ?
a[i][j][k]=0;?
答案:把循環語句內外換一下?
121. 以下是求一個數的平方的程序,請找出錯誤: ? ?
#define SQUARE(a)? ((a)*(a)) ? ?
int a=5;? ? int b; ? ?
b=SQUARE(a++);?
答案:這個沒有問題,s(a++),就是((a++)×(a++))唯一要注意的就是計算后a=7了?
122. 分析下列程序有什么問題
typedef unsigned char BYTE ? ? ?
int examply_fun(BYTE gt_len; BYTE *gt_code) ? ? ?
{ ? ? ? ?
BYTE *gt_buf;
gt_buf=(BYTE *)malloc(Max_GT_Length);
?? ? ?
...... ? ? ?
if(gt_len>Max_GT_Length) ? ? ? ?
{ ? ? ? ?
return GT_Length_ERROR; ? ? ? ? ?
}? ? ? ?
?....... ? //free? ?
}?
答案:要釋放內存問答題:?
123. static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
答案:全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。 static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件 static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用; static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值; static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝?
124. 判斷題
1、有數組定義int a[2][2]={{1},{2,3}};則a[0][1]的值為0。(正確)?
2、int (*ptr) (),則ptr是一維數組的名字。(錯誤? int (*ptr) ();定義一個指向函數的指針變量)?
3、指針在任何情況下都可進行>, <,>=, <=,==運算。( 錯誤 )
?//指針類型不同的時候
4、switch(c) 語句中c可以是int ,long,char ,float (//錯),unsigned int 類型。(? 錯,不能用實形 )?
★125. 填空題
1、寫出運行結果
char str[ ]= "Hello";
char *p=str;?
int n=10;?
sizeof(str)=(? ? 6? )?
sizeof(p)=(? ? ? )?
sizeof(n)=(? ? ? )?
void func(char str[100])
{ ? ?
··· ···
}?
sizeof(str)=(? ? ) ?
答案:6,4,4,4,?
126.不使用庫函數,編寫函數int strcmp(char? *source, char *dest) 相等返回0,不等返回-1;?
答案:一、
int strcmp(char? *source, char *dest)?
{ ?
assert((source!=NULL)&&(dest!=NULL)); ?
int i; ?
for(i=0; source[i]==dest[i]; i++) ?
{ ?
if(source[i]=='\0' && dest[i]=='\0') ? ?
return 0;?
else ? ?
return -1; ?
}?
}?
答案:二、?
int strcmp(char *source, char *dest)
{ ? ?
If ( ) { }
while ( (*source != '\0') && (*source == *dest))? ?
?{
?source++; dest++; ? ?
} ? ?
return ( (*source) - (*dest) ) ? -1 : 0;
?}?
127. 寫一函數int fun(char *p)判斷一字符串是否為回文,是返回1,不是返回0,出錯返回-1 ? eg:12321
答案:一、?
int fun(char *p)
{? if(p==NULL) ?
return -1; ?
else ?
{? int length = 0;? int i = 0;? int judge = 1;? length = strlen(p); ?
for(i=0; i <length/2; i++) ?
{? ? if(p[i]!=p[length-1-i])? ?
{ judge = 0; ? ?
break;
} ?
} ?
if(judge == 0) ? ?
return 0; ?
else ? ?
return 1; ?
}?
}?
答案:二、?
int fun(char *p)
{?
int len = strlen(p) - 1;
char *q = p + len;?
if (!p) return -1;
while (p < q)?
{?
if ((*p++) != (*q--))?
return 0;?
}?
return 1;
} ?
128.?
1.在OSI 7 層模型中,網絡層的功能有( B) //ip地址
A.確保數據的傳送正確無誤 //傳輸層 B.確定數據包如何轉發與路由 C.在信道上傳送比特流? ? D.糾錯與流控?
2.FDDI 使用的是___局域網技術。(C )?
A.以太網;? ? B.快速以太網;? ? C.令牌環;? ? D.令牌總線。
注: (光纖分布數據接口(FDDI)是目前成熟的LAN技術中傳輸速率最高的一種)
3.下面那種LAN 是應用CSMA/CD協議的(C)?
A.令牌環? ? B.FDDI? ? C.ETHERNET? ? D.NOVELL?
4.TCP 和UDP 協議的相似之處是 (C )?
A.面向連接的協議? ? B.面向非連接的協議? ? C.傳輸層協議? ? D.以上均不對?
5.應用程序PING 發出的是___報文.(C )
?A.TCP 請求報文。? ? B.TCP 應答報文。? ? C.ICMP 請求報文。? D.ICMP 應答報文。
?
6.以下說法錯誤的是(多) (BD )?
A.中繼器是工作在物理層的設備? ? B.集線器和以太網交換機工作在數據連路層 C.路由器是工作在網絡層的設備? ? D.橋能隔離網絡層廣播?
7.當橋接收的分組的目的MAC地址在橋的映射表中沒有對應的表項時,采取的策略是( C)
A.丟掉該分組? B.將該分組分片? ? C.向其他端口廣播該分組? ? D.以上答案均不對?
8.LAN Switch(局域網交換機) 在網絡層次模型中的地位( B)?
A.物理層? ? B.鏈路層? ? C.網絡層? ? D.以上都不是?
9.小于___的TCP/UDP端口號已保留與現有服務一一對應,此數字以上的端口號可自由分配。( C)?
A.199? ? ? B.100? ? C.1024? ? ? D.2048?
10.當一臺主機從一個網絡移到另一個網絡時,以下說法正確的是 (B )?
A.必須改變它的IP 地址和MAC 地址 ? ?
B.必須改變它的IP 地址,但不需改動MAC 地址?
C.必須改變它的MAC 地址,但不需改動IP 地址 ? ?
D.MAC 地址.IP 地址都不需改動
129. 找錯?
#define MAX_SRM 256?
DSNget_SRM_no()?
{ ? ?
static int SRM_no; ? ?
int I; ? ?
for(I=0;I <MAX_SRM;I++,SRM_no++) ?
{ ? ?
SRM_no %= MAX_SRM; ? ?
if(MY_SRM.state==IDLE) ? ?
{? ? ? break;? ? } ?
} ?
if(I>=MAX_SRM) ? ?
return (NULL_SRM); ?
else ? ?
return SRM_no;?
}?
答: 1,SRM_no沒有賦初值?
2,由于static的聲明,使該函數成為不可重入(即不可預測結果)函數,因為SRM_no變量放在程序的全局存儲區中,每次調用的時候還可以保持原來的賦值。這里應該去掉static聲明。?
130. 寫出程序運行結果?
int sum(int a)?
{
auto int c=0; ? ?
static int b=3; ?
c+=1; ? ? ? ? ? ? ? ? ? //c = 1
b+=2;? ? ? ? ? ? ? ? ? // b = 5
return(a+b+c); ? ? ? ? // 8
} ?
void main()?
{
int I; ?
int a=2;?
for(I=0;I <5;I++) ?
{
? ? printf("%d\n", sum(a)); ?
}?
}?
答:8,10,12,14,16 該題比較簡單。只要注意b聲明為static靜態全局變量,其值在下次調用時是可以保持住原來的賦值的就可以。?
131.
int func(int a)?
{ ? ?
int b; ? ?
switch(a) ? ?
{ ? ? ? ?
case 1: b=30; ? ? ? ?
case 2: b=20; ? ? ? ?
case 3: b=16;? ? ? ?
default: b=0;? ?
} ? ?
return b;?
} 則func(1)=??
答:func(1)=0,因為沒有break語句,switch中會一直計算到b=0。這是提醒我們不要忘了break?
132.
int a[3]; ?
a[0]=0;?
a[1]=1;?
a[2]=2; ?
int *p, *q; ?
p=a; ?
q=&a[2];?
則a[q-p]=??
答:a[q-p]=a[2]=2;這題是要告訴我們指針的運算特點?
133. 定義 int **a[3][4], 則變量占有的內存空間為:_____?
答:此處定義的是指向指針的指針數組,對于32位系統,指針占內存空間4字節,因此總空間為3×4×4=48。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
134.設有int a=3;則執行語句a+=a-=a*a;后
變量a的值是? ?
結果:a = -12
過程:
a+=a-=a*a 等效于 a+=(a-=a*a);
a -= a * a 等效于 a = a - a * a;
→a = -6
a += a 等效于 a = a + a;
→a = -12?
答案:-12
135.?
Struct RegX
{
long bzy:1;
long wrt:1;
?? long rd:1;
long cnt:4;
long rsd:25;
};
Sizeof(RegX)=?
答案:4
136.
Char a[]=“hello\0”;// /0系統會自己加的 不管你有沒有”/0”
Char al[7]=“hello”;
Char *ps=“hello”;
Strlen(a)= ? Strlen(a1)= ? Strlen(ps)= ?
Sizeof(a)= ? Sizeof(a1)= ? Sizeof(ps)= ?
5 5 5 ,7 7 4?
137.對于下面的函數,要求打印出”hello”,子程序完全正確的是_(1)(3)_, 一定能打印出”hello”的是_(1)(3)(4)_,有錯誤的是__(2)(4)
char *GetHellostr(void);
int main(void)
{
char *ps;
ps= GetHellostr( );
if(ps != NULL)
{
printf(ps);
}
return 0;
}
(1)
char *GetHellostr(void)
{
char *ps=“hello”;
return ps;
}
(2)
char *GetHellostr(void)
{
? ? char a[]=“hello”;
return (char *)a;
}
(3)
char *GetHellostr(void)
{
static char a[]=“hello”;
return (char *)a;
}
(4)
char *GetHellostr(void)
{
char *ps;
ps = malloc(10);
if(NULL ==ps) return NULL;
strcpy(ps,”hello”);
return ps;
}
★138.下面程序分別只改到一處,就OK了,要求打印出”welcome to saif”
(1)
void main(void)
{
char str1[]=“welcome ”;
char str2[]=“to ”;
char str3[]=“saif ”;
char str[50];
memcpy(str,str1,sizeof(str1)); ? //? welcome \0
memcpy(str+sizeof(str1),str2,sizeof(str2)); ? //welcome \0 to \0
memcpy(str+strlen(str1)+strlen(str2), str3,sizeof(str3));
printf(str);
}
答案:sizeof->strlen
(2)
void main(void)
{
char str1[]=“welcome ”;
char str2[]=“to ”;
char str3[]=“saif ”;
char str[50];
memcpy(str,str1, strlen(str1));
memcpy(str+strlen(str1),str2, strlen(str2));
memcpy(str+strlen(str1)+strlen(str2), str3, strlen(str3));
printf(str);
}
答案:strlen->sizeof
139.
Struct tag
{
short c;
long b;
char d;
long a;
}
改變結構體的排列順序,Sizeof(tag)可能的值?
答案:11、12、16
140.找出程序中的所有錯誤
//分配len的長度的內存,內存地址由ptr輸出
void test_malloc(char **prt, int len)
{
char *tmp=NULL;
tmp=(char*)malloc(len);
*prt=tmp;
}
void main(void)
{
char *str=“welcome to saif”;
char *buf;
char c=0xff;
test_malloc(&buf, sizeof(str));? ? //strlen(str)+1
if(buf ==NULL)? ? ? ? ? ? ? ? ? ? //(NULL == buf)
{
return;
}
strcpy(buf , str);
if( c==(char)0xff)
{
printf(“OK,str=%s”,buf);
}
else
{
printf(“OH my God!”);
}
free(buf);
}
141.
?union a {
?? int a_int1;
?? double a_double;
?? int a_int2;
}; ? ? ? ? ? ? ? ? ? ? ? ? ? // 8
typedef struct
{
? ?a a1;
?? char y;
} b;
問題sizeof(b) = ?
答案:12
142. 用遞歸法將整數轉化為字符串
void convert( int n )
{?
int i;
Char c;
if ((i=n/10)!=0)
?? ? ? convert(i);
c=n%10 +’0’;
cout<<” “<<c;
}
123 –> “123”