c语言每日一练(14)【加强版】

news2024/11/27 10:36:52

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。博主有时会将一些难题综合成每日一练加强版,加强版是特殊的,它仅包含5道选择题,但这5道选择题都是博主精挑细选的,希望大家能够认真看看,相信一定能有所收获。每日一练系列会持续更新,上学期间将看学业情况更新。

有学习或者生活方面的问题都可直接私信博主询问,博主看到会回复,太久没回复就扣个1提醒下博主

五道易错选择题: 

1、以下正确的程序段是()
A、char str[20];scanf("%s",&str);

B、char *p;scanf("%s",p);

C、char str[20];scanf("%s",&str[2]);

D、char str[20],*p=str;scanf("%s",p[2]);

解析:选项A,&str得到的是整个数组的地址,也就是说它的权重是整个数组,那么&str+1就会跳过一整个数组进行操作,所以你想使用scanf("%s",&str);来进行字符串的修改会越界,A错误。扩展:有的编译器上面的scanf实现是通过强转成字符然后使用字符的特殊性(一个字符占一个字节的空间,也就是说字符型指针的权重是一个字节)挨个将不同类型的值进行修改实现scanf的。强转成字符型指针时,它的权重就不再重要,所以使用这类scanf函数A选项是没问题的,但这不具备普遍性,所以A可以认为是错误的。

选项B,空间没开辟好,会使用到野指针,有安全隐患,B错误。选项C,&str[2]可写作&*(str+2),&和*号抵消,来到了偏移量为2的地址,也就是说,它可以正常输入17个字符,形成一个长度为18的字符串,C没有犯语法错误,题目并没有要求程序实现的结果,所以C是正确的。

选项D,p是首地址,p[2]是首地址偏移量为2的地址所指向的字符,也就是说p[2]不是地址,它是字符,不符合scanf的使用要求,D错误。综上所述,答案选C

 2、设已有定义:char*st="how are you";下列程序段中正确的是()

A、char a[11],*p;strcpy(p=a+1,&st[4]);
B、char a[11];strcpy(++a,st);
C、char a[11];strcpy(a, st);
D、char a[],*p;strcpy(p=&a[1],st+2):

解析:st是一个数组指针,存放的是字符串how are you\0的首地址,由于是字符串的形式所以它的最后有个隐藏的\0,数数就可以知道这个字符串长3+1+3+1+3+1=12。

先看A选项,p=a+1,也就是p为数组首地址的下一个地址,因此p最多拷贝10个字符,而&st[4]可以写作&(*(st+4)),*(st+4)就是how 和 are 中间的空格,再&就是得到这个空格的地址,从这个位置往后数,显然小于10,故成功拷贝,A正确。

B选项,++a,a是地址啊,你怎么能对地址修改呢,B大错特错。C选项,12个字符拷贝进只能存放11个字符的数组,拷贝失败,C错误。

D选项,char a[],定义都定义错误了,想要不写字符数组长度的前提是,你得对它初始化,比方说char a[]="hello world";D选项定义都定义不明白,D错误。综上所述,答案选A

3、若有说明;int*p,m=5,n;以下正确的程序段的是()

A、p=&n;scanf("%d",&p);
B、p=&n;scanf("%d",*p);                                                                                                                  C、scanf("%d"&n);*p=n;
D、p=&n;*p=m;

解析:先分析代码,int*p,m=5,n;分别定义了一个指针变量p和两个整型变量m,n,其中m被初始化为5。

接着先看A选项,p=&n,也就是说p现在储存的是n的地址,然后再scanf("%d",&p);&p相当于对n的地址再取地址,因此scanf操作的是n的地址,它会将n的地址进行修改,但这显然错误,因为地址是不可被修改的,故A错误。

B选项,scanf("%d",*p);p是n的地址,*p即是n,你scanf("%d",n);没有取地址,无法进行值的修改,B错误。C选项,scanf("%d",&n);这一步没有问题,简单的修改n变量的值,*p=n就很有问题,因为你p并没有初始化为空指针,所以此时p是一个野指针,你对野指针解引用并赋值会造成不可预知的后果,所以C错误。

D选项,先是令p=&n;也就是说,p现在存有n的地址,你再解引用p对p地址所指向的值修改就相当于对n进行修改,并没有语法上的错误,D正确。综上所述,答案选D 

4、以下程序段中,输出信息不能正确反映变量大小关系的是()
A、

if (x > y) printf(" x > y ");//1
if (x < y) printf("x < y ");//2
else printf(" x = y ");//3

A选项解析: 根据if,else的就近匹配原则,代码2和代码3匹配,我们可以先假设x>y走一遍,当x>y时,执行代码1,但走到代码2时会因为else走先代码3,所以它会同时打印出x>y和x=y,因此A不能正确反映变量大小关系。

B、

if (x >= y)//1
if (x > y) printf("x > y");//2
else printf("x = y");//3
else printf("x < y");//4

B选项解析: 先就近原则判断,得出:1和4匹配,2和3匹配。那么当x>y时,先进入代码1,满足条件,进入代码1下的if判定,再判定,满足条件,进入代码2,打印x>y,正确。当x=y时,满足1,进入1下的判定,不满足,走到代码3,打印x=y,正确。当x<y时,代码1不满足,直接走到代码4,打印x<y,正确。综上所述,可以正确反映变量的大小关系。

C、

if (x > y) printf(" x > y ");//1
if (y > x) printf(" x < y ");//2
if (x == y) printf(" x = y ");//3

C选项解析:当x>y直接打印x>y,正确。当x=y时,x>y和y>x均不满足条件,均不打印对应内容,走到代码3打印x=y,正确。x<y同理。综上所述,可以正确反映变量的大小关系。 

D、

if (x > y) printf(" x > y ");//1
else if (y < x) printf(" x < y ");//2
else printf(" x = y ");//3

 D选项解析:观察代码,1和2匹配,2和3匹配。当x>y时,走1打印x>y,后面的else if不执行,再下面的else是和2的if匹配的,自然也不执行。当x=y时,走1判定为假,走2,判定为假,走到3,打印x=y,正确。当x<y时,走1判定为假,走2,判定为真,打印x<y,后面的else不执行,正确。综上所述,可以正确反映变量的大小关系。

根据上述,得答案为A 

 看到这里的友友相信已经有点疲劳了,我们就最后来道简单点的题。

5、有以下程序,程序运行时输入:-1 -2 0 1 2 <回车>,则输出结果是()

#include <stdio.h>
int main()
{
	int x, a = 1, b = 1;
	while (1)
	{
		scanf("%d", &x);
		if (x > 0) { a *= x; break; }//1
		if (x < 0) { b *= x; continue; }//2
		printf("%d,%d\n", a, b);
	}
}

A、2,2
B、1,2
C、-1,1
D、-2,1 

解析:观察代码可以发现,这是个死循环。当x>0时会跳出循环,当x<0时循环会强制继续,这两种情况都走不到printf,只有当x=0时才会打印出a和b,输入-1 -2 0 1 2<回车>,就相当于在数据流中存放了-1,空格,-2,空格,0,空格,1,空格,2,空格。而scanf会将空格当作结束标志,也就是说如果循环正常运行,x将被依次赋予为-1,-2,0,1,2 。

当x=1时,走代码2,令b*=1,所以b=-1。当x=-2时,走代码2,令b*=x,所以b=2。当x=0时,直接打印出a,b,此时a=1,b=2,所以打印出1,2。而当x=1时会走到代码1跳出循环,后面的2依然存放在数据流中,不会赋值给x,当程序结束之后会被清除,对于此题并无影响。至此,程序结束,最终输出1,2,答案选B

好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将home目录空间扩充到根目录下

目录 1、查看查看磁盘使用情况2、扩容思路3、卸载并删除/home4、扩大/root逻辑卷5、扩大/文件系统6、重建/home逻辑卷7、创建/home文件系统8、将新建的文件系统挂载到/home目录下9、恢复/home并删除备份10、再次查看看磁盘存储 系统&#xff1a;centos7.9 1、查看查看磁盘使用…

shell指令练习

一、使用cut截取出Ubuntu用户的家目录&#xff0c;要求&#xff1a;不能使用":"作为分割 ubuntuubuntu:01_day$ grep "^Ubuntu" /etc/passwd -ni | cut -d "/" -f 2,3 | cut -c 1-11 home/ubuntu

【算法专题突破】双指针 - 和为s的两个数字(6)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;剑指 Offer 57. 和为s的两个数字 - 力扣&#xff08;Leetcode&#xff09; 这道题题目就一句话但是也是有信息可以提取的&#xff0c; 最重要的就是开始的那句话&#…

SonarQube介绍和安装

docker安装postgres数据库 docker安装sonarqube 安装前在官网上确定一下可用的版本号 创建sonarqube_docker目录 本实验中&#xff0c;jdk,maven,jenkins,postgres,sonarqube都安装在同一台服务器上。 docker compose启动 修改虚拟机内存 sonarqube启动成功 默认用户名和密…

Javase | 字符编码、转义字符、方法执行过程中的 “内存分配”

目录&#xff1a; 字符编码转义字符&#xff1a;转义字符在控制台上输出 “反斜杠字符”在控制台上输出 “单引号字符” 方法执行过程中的 “内存分配” 字符编码 为了让计算机可以表示现实世界中的文字&#xff0c;我们需要人为进行干涉&#xff0c;需要人负责提前制定 “文字…

Linux系统之mkdir与rmdir命令的基本使用

Linux系统之mkdir与rmdir命令的基本使用 一、mkdir命令介绍1.1 mkdir命令简介1.2 mkdir命令的由来 二、mkdir命令的使用帮助2.1 mkdir命令的help帮助信息2.2 mkdir命令的选项解释 三、mkdir命令的基本使用3.1 查看mkdir的版本3.2 创建一个新目录3.3 创建目录时设置目录权限3.4 …

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…

vue优化首屏加载时间优化-cdn引入第三方包

前言 为什么要进行首屏加载优化&#xff0c;因为随着我们静态资源和第三方包和代码增加&#xff0c;压缩之后包会越来越大 随着网络的影响&#xff0c;在我们第一输入url请求资源时候&#xff0c;网络阻塞&#xff0c;加载时间长&#xff0c;用户体验不好 仔细观察后就会发现…

linux和macOS平台中python语言文件上传的一处不同实现

背景 linux系统&#xff0c; python语言&#xff0c;tornado框架 现象 x文件在macOS平台可正常上传&#xff0c; linux平台上传失败。 x文件说明 文件名&#xff1a;xxxx秘密 .mp3 文件格式&#xff1a;mp3 原因 文件名包含\x20\x7f导致, \x20是设备控制&#xff0c; \…

Android逆向工程【黑客帝国】

Android逆向是一门艺术&#xff0c;涵盖的范畴非常广&#xff0c;要学习的东西也很多&#xff0c;如果是为了就业目的&#xff0c;学习的偏向性一定要掌握好。而Android逆向必须掌握的技能有以下&#xff1a; 负责安卓程序的加解密和数据传输分析、拆解、逆向等工作;逆向APK,了…

Agisoft/PhotoScan手动对齐照片

所以我到网上查了一下资料&#xff0c;了解了如何通过添加标记的方式&#xff0c;手动对齐照片。参考文档是PhotoScan的用户手册(http://www.agisoft.com/pdf/photoscan-pro_1_4_en.pdf)。 手动对齐照片&#xff0c;需要在未对齐照片上添加四个及以上标记&#xff0c;并在已对…

Android——数据存储(一)(二十一)

1. 数据存储 1.1 知识点 &#xff08;1&#xff09;掌握Android数据存储的分类&#xff1b; &#xff08;2&#xff09;可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言&#xff0c;Android一共提供了5个数据存储的方式&#xff1a;SharedPrefe…

Swift 另辟蹊径极速生成图片的缩略图

功能需求 在 App 开发中,创建图片缩略图是一种很常见的操作。但是超大图片如何快速且便捷的生成指定尺寸的缩略图呢? 如上图所示:我们极速生成缩略图比常规方式快了将近 27 倍之多!且生成代码没有用任何第三方库,完全是  原生实现。 在上面演示中包含几张数码相机原始…

huggingface 使用入门笔记

概念 Hugging Face Hub​​和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; ​模型仓库&#xff08;Model Repository&#xff09;​​&#xff1a;Git仓库可以让你管理代码版本、…

动态规划区间dp之647回文子串

题目&#xff1a; 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例&#xff1a; 题目链接&#xff1a;647.…

Android 线程池源码详解(一)

线程池的创建是通过Executors 构造出来的&#xff0c;这是个典型的工厂类&#xff0c;使用了工厂模式。常用的有四种线程池&#xff1a; 分别是newFixedThreadPool&#xff0c;newSingleThreadExecutor&#xff0c; newCachedThreadPool&#xff0c;newScheduledThreadPool&am…

小白备战大厂算法笔试(二)——数组、链表、列表

常见数据结构 常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图&#xff0c;它们可以从“逻辑结构”和“物理结构”两个维度进行分类。 逻辑结构可被分为“线性”和“非线性”两大类。线性结构比较直观&#xff0c;指数据在逻辑关系上呈线性排列&#xff1b;非线…

制药行业常见生产设备有哪些?

制药行业是一个关系到人民健康和生命安全的特殊领域&#xff0c;因此&#xff0c;生产质量和合规性是至关重要的。为了满足严格的生产质量管理规范&#xff08;GMP&#xff09;要求&#xff08;>>制药行业GMP是什么&#xff1f;&#xff09;&#xff0c;制药企业需要使用…

公司办公文件加密防泄密软件哪个好?

天锐绿盾是一款专业的数据安全解决方案&#xff0c;旨在保护企业的核心数据。它采用基于Windows、Mac、Linux内核的文档透明加解密技术&#xff0c;对指定类型的文件进行实时、强制、透明加密&#xff0c;使得文件在操作时自动解密&#xff0c;关闭时自动加密&#xff0c;能够有…

基于物理层网络编码的相位同步算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................%数据长度 Len…