写作能力有限,请多多包含( $ _ $ )
如有错误理解,请指出文中有误的地方。(可以私信)
一、选择题
1、如下程序的运行结果是( )
A: 'a' 'b' B: ab\0c\0 C: ab c D: ab
- 1. C语言字符串以'\0'结尾,扫描到即结束,故字符串打印的内容只有"ab"
- 2. char c[5] = { 'a', 'b', 's', 'c', 'd' }; printf("%s", c); 不会溢出!
char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);
答案:D
2、若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )
A: a[2][0] B: a[2][3] C: a[0][3] D: a[1>2][1]
- int a[2][3] 行坐标数字:0,1 列坐标数字:0,1,2
- AB 选项行坐标超范围 C选项列坐标超范围 D选项 1>2 --> 0
答案:D
3、在下面的字符数组定义中,哪一个有语法错误( )
A: char a[20]="abcdefg"; B: char a[]="x+y=5.";
C: char a[15]; D: char a[10]='5';
- D中的'5'是一个字符常量,不能给字符型数组a初始化
- char a[10]定义的是长度为10的字符数组,
如果是想初始化数组中内容全为'5'那应该是char a[10]={'5'};
如果是只是想a[10]为'5'的话,那应该是char a[10];a[10]='5';
答案:D
4、下列定义数组的语句中正确的是【多选】( )
A:
#define size 10
char str1[size], str2[size+2];
B: char str[]; C: int num['10']; D: int n=5; int a[n][n+2];
- A选项:宏替换,没问题;
- B选项:非法定义,一维数组必须定义数组元素个数;
- C选项:字符'0',转换成十进制为48,所以该选项最终为int num[48];
- D选项:n是变量,变量的值要在程序运行时才能知道(虽然我们能看到它的值是5,但程序不知道),而数组的大小在编译期就得确定。错误,数组定义下角标不能为变量,注:C99标准中支持了使用变量,这里不做特殊考虑。
答案:AC
5、已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )
A: *(X[i]+j) B: *(X+i)[j] C: *(X+i+j) D: *(*(X+i)+j)
- A选项,先走x[i]那么就是第i行,再走被包裹在括号内的+j,故走到第i行第j列的地址,再解引用得到内容,故与目标等效,故不选A。
-
B选项,()和[]优先级相同从左往右即可,但*的优先级最低,最后走,故走出来为**((x+i)+j),显然越界,不等效,B正确。
-
C选项,X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,不等效,C正确。
-
D选项,*(x+i)走到第i行,第0列,受到解引用*的影响,+j相当于走到第j列,再解引用,故得到第i行第j列的元素,等效,D错误。
答案:BC
二、编程题
1、字符个数统计_牛客题霸_牛客网 (nowcoder.com)
#include <stdio.h>
int main() {
char arr[501]={0};
while(~scanf("%s",&arr))
{
char table[128]={0};//新建数组放置标签
char *ptr=arr;
int count=0;
while(*ptr!='\0')
{
if(table[*ptr]!=1)//判断数组内部值是否被标记过
{
count++;//没有增加基数
}
table[*ptr++]=1;//小标置为1
}
printf("%d\n",count);
}
return 0;
}
2、169. 多数元素 - 力扣(LeetCode)
int majorityElement(int* nums, int numsSize) {
int res=nums[0]; // 第一支占领高地的军队
int count=0; // 此军队当前士兵数量为0
for(int i=0;i<numsSize;i++)
{
if(tmp==nums[i]) //若遇到相同元素,则当前军队增加一个士兵
{count++;}
else // 反之,当前军队被消灭一个士兵
{
count--;
if(count <= 0) //若高地全军覆没,则下一军队占领高地
{
res=nums[i+1];
}
}
}
return tmp; //返回最后占领高地
}