c笔试题(1)

时间:2023-03-10 05:35:44
c笔试题(1)

1.sizeof和strlen的区别

#include<stdio.h>

#include<string.h>

int main()

{

char a[10] = "12345";

char *p = "12345";

char b[20];

printf("%d %d\n",sizeof(a),strlen(a));

/*sizeof是运算符,strlen是函数,sizeof要加上'/0',

strlen表示字符串的长度,且strlen的参数只能是'char*' */

printf("%d %d\n",sizeof(*a),strlen(a));

printf("%d %d\n",sizeof(p),strlen(p));

printf("%d %d\n",sizeof(*p),strlen(p));

/*由于b是未知的,所以strlen是不确定的*/

printf("%d %d\n",sizeof(b),strlen(b));

printf("%d %d\n",sizeof(*b),strlen(b));

return 0;

}

运行结果:

10   5

1    5

4    5

1    5

20   23

1    23

2.下列程序的运行结果

#include<stdio.h>

int main()

{

double a[2]={3,9},*p,*q;

p=&a[0];

q=p+1;

printf("%d    %d\n",(q-p),(int)q-(int)p);

return 0;

}

运行结果:1   8

3.下列程序

#include<stdio.h>

int main()

{

#define SUN 0

printf("1");

#ifndef SUN

printf("2");

#endif

printf("3");

return 0;

}

运行结果:

13

4.数组的时候int *p=(int*)malloc(10*sizeof(int)) 释放的时候 free(p)即可;这是因为编译器对malloc做了一些特殊的处理,以保证可以正确释放内存。而当int *p=new int[10]释放的时候应为delete []p,注意[]的作用说明释放的是一个数组的内存,如果delete p则只是释放的p[0],其余9个int的内存没有释放;这是因为当指明为[]的时候,编译器实际上是做了一个循环来释放这个数组的所有内存。

5.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、 13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

int NumberOf1Between1AndN_Solution(int n)

{

int count=0;

for(int j=1;j<=n;j++)

{

int i=j;

while(i)

{

if(i%10==1)

count++;

i=i/10;

}

}

return count;

}

6.像如a=(b++,c++)这类语句,a的值就是c++。

7.fork()函数的头文件是#include<unistd.h>,且fork()函数是按2的n次方进行递增的。