C语言—每日选择题—Day68

第一题

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

这个自己按着程序思路遍历一遍就行

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终将向阳而生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值