第一题
1、运行以下C语言代码,输出的结果是()
#include <stdio.h>
int main()
{
char *str[3] ={"stra", "strb", "strc"};
char *p =str[0];
int i = 0;
while(i < 3)
{
printf("%s ",p++);
i++;
}
return 0;
}
A: stra strb strc
B: s t r
C: stra tra ra
D: s s s
答案及解析 C
这里需要注意的是printf函数,会自动识别字符串,到\0位置结束打印
而p为char*类型,p++,只会移动一个字节,p++后置++,返回++之前的值
所以第一次打印:stra,但p在t位置
第二次:tra,但p在r位置
第三次为:ra,但p在a位置
第二题
2、下列代码输出的结果是什么()
#include <stdio.h>
int main()
{
int m[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int(*p)[4] = (int(*)[4])m;
printf("%d", p[1][2]);
return 0;
}
A: 7
B: 3
C: 8
D: 4
答案及解析 A
这里p是一个数组指针,类型为int(*)[4]
p[1] [2] 相当于:*(*(p + 1) + 2),p的类型为int (*) [4],所以p + 1,是往后4个元素大小
相当于取到了5,6,7,8的整个地址
而数组指针,这样理解更容易:int arr[4];
&arr :表示整个数组的地址,是数组指针,对数组指针解引用:*&arr = arr;
所以对数组指针解引用得到的是数组指针开头的元素地址;
那*(p + 1) 就是5的地址,类型int*
所以*(*(p + 1) + 2),就是往后移动两个元素,到7的地址,再解引用拿出7;
第三题
3、下列程序的输出结果是( )
int main()
{
char p1[15]="abcd", *p2="ABCD", str[50]="xyz";
strcpy(str + 2, strcat(p1+2, p2+1));
printf("%s", str);
return 0;
}
A: xyabcAB
B: abcABz
C: ABabcz
D: xycdBCD
答案及解析 D
首先要记住strcpy,是覆盖到str + 2,所指向的地址,所以应该在z往后覆盖;
而strcat,是链接字符串,从p1 + 2 为起始位置,p2 + 1为起始位置,p2 + 1链接到p1 + 2末尾:cdBCD
strcpy中:就是z变成cdBCD
所以str就是xycdBCD
第四题
4、以下叙述中正确的是( )
A: 两个字符串可以用关系运算符进行大小比较
B: 函数调用strlen(s);会返回字符串s实际占用内存的大小(以字节为单位)
C: C语言本身没有提供对字符串进行整体操作的运算符
D: 当拼接两个字符串时,结果字符串占用的内存空间是两个原串占用空间的和
答案及解析 C
A:错误,字符串比较需要使用strcmp函数,因为要比较相同位置的字符的ASCII值
B:错误:strlen函数返回的是到 ‘ \0 ’之前的长度,而 ' \0 '也占用了内存,并没返回实际占用内存大小;
C:正确
D:错误:在拼接的时候,是舍去了一个字符串的 '\0',结果字符串占用内存的空间应该是原字符串空间和 - 1;
第五题
5、程序的结果是什么( )
#include<stdio.h>
char* f(char* str, char ch)
{
char* it1 = str;
char* it2 = str;
while(*it2 != '\0')
{
while (*it2 == ch)
{
it2++;
}
*it1++ = *it2++;
}
return str;
}
int main()
{
char a[10];
strcpy(a, "abcdcccd");
printf("%s", f(a, 'c'));
return 0;
}
A: abdcccd
B: abdd
C: abcc
D: abddcccd
答案及解析 D
这个自己按着程序思路遍历一遍就行