C语言易错点整理
前言:
本文涵盖了博主在平常写C语言题目时经常犯的一些错误,在这里帮大家整理出来,一些易错点会帮大家标识出来,希望大家看完这篇文章后有所得,引以为戒~
一、
题目:
解答:
首先在这个程序中有两个x,y,一个是在主函数中定义的局部变量,另一个是全局变量。
而在swap函数中将两个值进行了交换,因为在主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系!所以swap函数是将在主函数外部的全局变量进行了交换。
其次在主函数中我们需要打印x,y,根据输出语句,局部变量优先的原则,所以最后的结果就是3,8
易错点:
- 不知道在主函数中定义的变量只在主函数中有效
- 不知道在输出语句中,局部变量优先的原则
二、
题目:
解答:
本题选择B,
\ddd ddd表示1到3个八进制数(d用八进制数表示才合法)
\xhh hh表示1到2位十六进制数 (h用十六进制数表示才合法)
原因是 '\8' 表示错误,因为转义字符\后面只要跟了十进制的数字,就是表示八进制数,但是八进制表示的范围是0~7, 所以'\8' 表示错误。
易错点:
不知道常见转义字符的形式,\后面直接跟数字,表示是一个八进制数,但表示形式必须要用0~7;同理/后面跟x表示是一个十六进制数,表示形式也必须使用十六进制~
小总结:
以后看到字符表示中有\在前面就表示它是一个转义字符,看\后面的字母来判断这是什么样的字符。
三、
题目:
解答:
本题要求根据输入的日期,计算是这一年的第几天。
我们可以把每一月的月数存放在一个数组中,根据输入的月份for循环累加,特殊情况判断闰年的情况。
源码:
int main()
{int year = 0;int month = 0;int day = 0;int sum = 0;int num[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//直接用数组创建,比switch语句简洁了不少while(scanf("%d %d %d",&year,&month,&day) != EOF){if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))num[1] = 29;//累加月份,这种事就让电脑干for(int i = 0;i < month-1;i++){sum += num[i];}sum += day;printf("%d\n",sum);}return 0;
}
四、
题目:
解答:
\\表示一个 '\' 字符,\123表示一个八进制数,\t 表示水平制表。所以最后的结果是12.
易错点:
\\ \' \'' \ddd \xhh
以上这几个比较容易出错,需要多加注意。
五、
题目:
如下函数f(1)的值是多少
解答:
首先明确i是一个局部变量,此题注意静态局部变量的使用,改变局部变量的销毁时期。
static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,以此类推
易错点:
不清楚静态局部变量的意义。静态局部变量存储在静态存储区,当静态局部变量离开作用域后,并没有被销毁,被修饰变量的值没有改变,比如本题的i变量的值不会改变,会一直++。
六、
题目:
解答:
本题关键在于知道规律后,能够找到第 n 个数据立方的起始奇数,
但我觉得最重要的是如何将一个整型表达式转化为字符串类型?
这里需要引用一个新函数sprintf函数,它可以直接将整型类型转换为字符串类型。
sprintf函数的用法
格式化字符串但是不用于打印而是放到一个buf中,所以需要提前创建一个char类型的数组。
可以直接将整型全部转换为字符串类型:
int main()
{char buf[100];int a = 100;int b = 20;//sprintf(buf, "%d", a);sprintf(buf, "%d+%d", a, b);printf("%s", buf);return 0;
}
可以部分转换,以本题举例:
int main()
{
int m;
while(~scanf("%d", &m)){
int start = m * (m - 1) + 1;//找到对应m^3的起始奇数
char buf[10240] = {0};
//sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中
sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中
for (int i = 1; i < m; i++) {
//然后将紧随随后的m-1个奇数数字转换为字符串,按照指定格式放入buf中
//%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数
sprintf(buf, "%s+%d", buf, start+=2);
}
printf("%s\n", buf);
}
return 0;
}
七、
题目:
易错点:
- getchar()读取所有字符,所以最后的回车也会被读入
- 若代码switch语句中没有break,则每次找到入口进入后,顺序执行到代码块结束为止!
八、
题目:
以下程序的功能:
解答:
总结:
九、
题目:
数字在升序数组中出现的次数_牛客题霸_牛客网 (nowcoder.com)
注意题目中要求时间复杂度在O(logN),并且还是非降序,很明显这题要使用二分思想。
思路:
- 中间比找的值大:则要找的数字肯定在右边, left = mid + 1;
- 中间比找的值小:则要找的数字肯定在左边, right = mid - 1;
- 中间值与找的值相同:
源码:
int GetNumberOfK(int* nums, int numsLen, int k ) {// write code here//先二分找到最左边的数字位置,再二分查找最右边的数字位置,两个位置相减+1就是长度int cnt = 0;int left = 0;int right = numsLen - 1;int mid;while(left <= right) {mid = (left+right)/2;//每次循环都需要放在中间if(nums[mid] > k){right = mid-1;}else if (nums[mid] < k){left = mid+1;}else {int ret = mid;while(nums[ret] == k){ret--;}left = ret+1;ret = mid;while(nums[ret] == k){ret++;}right = ret-1;return right - left + 1;}}return 0;
}
十、
题目:
解答:
|| 操作符表示只要有一个为真就是真,刚开始0<5,执行i++,当i = 1时,
逻辑或操作符前表达式为真,后表达式不计算!所以前表达式i = 1,后面的i++,就不计算,因此i恒为1,所以是死循环!
易错点:
不知道逻辑或操作符当前表达式为真,后表达式不计算这个特点
十一、
题目:
解答:
十二、
题目:
解答:
字符数组定义的两种方式:
arr1和arr2都是合法的,arr3报错是字符数组初始化需要带括号的初始化表达式。
十三、
题目:
169. 多数元素z
解答:
注意本题的要求是时间复杂度在O(N),所以不能简单的使用暴力双层循环的办法。
采用互拼的思想。
源码:
int majorityElement(int* nums, int numsSize)
{//利用互拼的思想int n = nums[0];int cnt = 1;for(int i = 1;i<numsSize;i++){if(n == nums[i])cnt++;elsecnt--;if(cnt == 0)n = nums[i+1];}return n;
}
十四、
题目:
解答:
十五、
题目:
238. 除自身以外数组的乘积
思路:
题目中要求使用O(N)的算法进行计算,我的第一想法是将所有数据相乘,遍历一遍数组元素,然后分别相除,但题目中有要求不能使用除法,但是除法与乘法互相转换的。
我们可以将乘积分为两次进行,第一次先将每个位置左边的数据乘积计算出来放到返回数组中,后边第二次循环将对应位置右边的数据乘积计算出来与返回数组对应位置的左半边乘积相乘得到结果。
源码:
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{int left[numsSize];int right[numsSize];*returnSize = numsSize;int* arr = (int*)malloc(sizeof(int)*(*returnSize));//分别计算每个元素左边的乘积left[0] = 1;int ret = 1;for(int i = 1;i<numsSize;i++){ret*=nums[i-1];left[i] = ret;}//分别计算每个元素右边的乘积ret = 1;right[numsSize-1] = 1;for(int i = numsSize-2;i>-1;i--){ret*=nums[i+1];right[i] = ret;}for(int i = 0;i<numsSize;i++){printf("%d ",left[i]);}printf("\n");for(int i = 0;i<numsSize;i++){printf("%d ",right[i]);}//最后计算两者相乘for(int i = 0;i<numsSize;i++){arr[i] = left[i] * right[i];}return arr;
}
十六、
题目:
448. 找到所有数组中消失的数字
题目中要求时间复杂度O(N),空间复杂度是O(1)。
思路:
TIP:
源码:
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){*returnSize = 0;int* arr = (int*)malloc(sizeof(int)*numsSize);//注意遍历到后面的值可能是负数,下标访问会越界,所以需要绝对值函数for(int i =0;i<numsSize;i++){int ret = abs(nums[i])-1;if(nums[ret] < 0)continue;else{nums[ret] = -nums[ret];}}for(int i = 0;i<numsSize;i++){if(nums[i] > 0){arr[*returnSize] = i+1;// ++ 的优先级要比 解引用* 操作符优先级高//*returnSize++; error!*returnSize+=1;}}return arr;
}
十七、
题目:
解答:
易错点:
十八、
题目:
解答:
易错点:
0'<=c<='9' 这个表达式并不是真正数学意义上的比较,在计算机语言中应该从右到左一一进行计算。
十九、
题目:
思路一:
将这个正数取余取出每一位,然后将每一位整型+'0',变为字符型即可。
源码:
int main()
{long long n = 0;scanf("%lld",&n);char* arr = (char*)malloc(sizeof(char)*1000);int num = 0;if(n == 0)printf("%d",n);while(n){arr[num++] = n%10 + '0';n/=10;}for(int i = 0;i<num;i++){printf("%c",arr[i]);}return 0;
}
思路二:
利用sprintf函数,不需要一个一个的进行取余,直接将整个整型的数字转换为字符型。
源码:
int main()
{int n = 0;scanf("%d",&n);char buf[1000];sprintf(buf,"%d",n);int len = strlen(buf);for(int i = len-1;i>-1;i--){printf("%c",buf[i]);}return 0;
}
二十、
题目:
单词倒排_牛客题霸_牛客网 (nowcoder.com)
思路:
源码:
int main()
{char arr[10005];char* ret[10005];//记录每一个单词的首元素地址int cnt = 0;//记录首元素地址的个数gets(arr);int len = strlen(arr);//单独判断首元素if((arr[0]>='a' && arr[0]<='z') ||(arr[0] >= 'A' && arr[0]<='Z')){ret[cnt++] = &arr[0];}else {arr[0] = '\0';}for(int i = 1;i<len;i++){if((arr[i]>='a' && arr[i]<='z') ||(arr[i] >= 'A' && arr[i]<='Z')){if((arr[i-1]>='a' && arr[i-1]<='z') || (arr[i-1] >= 'A' && arr[i-1]<='Z'))continue;else{ret[cnt++] = &arr[i];//将单词的首元素地址进行存储}}else{arr[i] = '\0';}}for(int i = cnt-1;i>-1;i--){printf("%s ",ret[i]);}return 0;
}
二十一、
题目:
解答:
易错点:
不知道当二进制位每一位都是1,之后再进行+1结果会变成全0。
二十二、
题目
解答:
本题首先是执行后置++,但是是后置++,实际的++操作是在本条语句的最后 然后就是*pa = *pa * 3;然后进行++
易错点:
忘记后置++的计算顺序,应该是最后再算++。
相关文章:
C语言易错点整理
前言: 本文涵盖了博主在平常写C语言题目时经常犯的一些错误,在这里帮大家整理出来,一些易错点会帮大家标识出来,希望大家看完这篇文章后有所得,引以为戒~ 一、 题目: 解答: 首先在这个程序中…...
60.每日一练:回文数(力扣)
目录 问题描述 代码解决以及思想 解法(一) 知识点 解法(二) 问题描述 代码解决以及思想 解法(一) class Solution { public:bool isPalindrome(int x) {string arr to_string(x); // 将整数转换为…...
算法通关村第5关【青铜】| Hash和队列的特征
1.Hash基础 (1)基础 哈希也称为散列,通过算法变成固定长度的输出值,存入对应的位置 例如这个算法为取模算法,indexnumber 模 7 存入1到15 (2)碰撞处理 当多个元素映射到同一位置上时就产生…...
C++:函数
函数参数的传递机制 C的每个程序至少有一个函数,即主函数main(),函数也是类的方法的实现手段。C的函数包括两类:预定于函数和用户自定义函数。 函数的定义格式为: <返回值类型><函数名>(<参数列表>) <函…...
Linux网络编程:libevent事件通知库
文章目录: 一:libevent库 二:libevent框架 1.常规事件event 1.1 创建事件event(event_new) 1.2 添加事件到 event_base(event_add) 1.3 从event_base上摘下事件(event_del&a…...
java.lang.reflect.InvocationTargetException:null报未知异常
在项目上线过程中,突然出现大量异常信息,堆栈信息如下: java.lang.reflect.InvocationTargetException: null at jdk .internal.reflect.GeneratedMethodAccessor792 .invoke(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingM…...
MySQL高级篇——MySQL架构篇1(Linux下MySQL8的安装与使用)
目录 0 安装前0.1 Linux系统及工具的准备0.2 查看是否安装过MySQL0.3 MySQL的卸载 1 MySQL8的Linux版安装1.1 MySQL的4大版本1.2 下载MySQL指定版本1.3 CentOS7下检查MySQL依赖1.4 CentOS7下MySQL安装过程 2 MySQL登录2.1 首次登录2.2 修改密码2.3 设置远程登录 3 MySQL 8 的密…...
解决 go mod tidy 加载模块超时
如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息: go envgo env -w GOPROXYhttps://goproxy.cn...
金融市场中的机器学习;快手推出自研语言模型“快意”
🦉 AI新闻 🚀 OpenAI可能面临《纽约时报》的起诉,侵犯知识产权引发争议 摘要:OpenAI使用《纽约时报》的文章和图片来训练AI模型,违反了《纽约时报》的服务条款,可能面临巨大损失。此前,也有其…...
【面试刷题】——什么是深拷贝和浅拷贝?
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中用来描述对象拷贝的两个概念,特别是在涉及对象包含其他对象(如嵌套数据结构、指针等)的情况下。 浅拷贝(Shallow Copyÿ…...
物联网(IoT)安全挑战与解决方案: 分析物联网设备面临的安全威胁,以及如何设计和管理安全的IoT生态系统
第一章:引言 随着科技的飞速发展,物联网(IoT)作为连接世界的桥梁,已经成为现代社会不可或缺的一部分。然而,随着IoT设备数量的不断增加,其安全问题也日益显著。本文将深入探讨IoT领域面临的安全…...
Ubuntu 22.04.3 LTS 维护更新发布
近日消息,Canonical 今天发布了代号为 Jammy Jellyfish、长期支持的 Ubuntu 22.04 第 3 个维护版本更新,距离上个版本相隔 6 周时间。 Ubuntu 22.04.3 LTS 最大的亮点在于内核升级到 Linux Kernel 6.2,此外 Mesa 图形堆栈也升级到 23.0.4 版…...
平安健康,找到了医疗服务的价值密码
健康是人类的永恒需求,围绕医疗和健康服务衍生的产业,却苦于无法和用户建立足够紧密、长期的联系。由此,也不得不面临价值从何而来的问题。 作为医疗服务领域的代表性企业,平安健康医疗科技有限公司(股票简称“平安好…...
❤ vue 使用原生组件
❤ vue 使用原生组件 1、做一个input输入框验证开始 ① 想让我们的input输入框类型为时间,只需要为我们的输入框简单的加一个类型的type即可 <input type"date" id"birthday" name"birthday" placeholder"年/月/日"&…...
4.12 TCP 连接,一端断电和进程崩溃有什么区别?
目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机,又迅速重启 客户端主机宕机,一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…...
十二、pikachu之URL重定向
文章目录 1、URL重定向概述2、实战3、URL跳转的几种方式:3.1 META标签内跳转3.2 javascript跳转3.3 header头跳转 1、URL重定向概述 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋…...
贝叶斯公式中的动词 命名技巧
一项血液化验有95%的把我诊断某种疾病,但是,这项化验用于健康人也会有1%的“伪阳性”结果(即如果一个健康人接受这项化验,则化验结果乌镇此人患有该疾病的概率是0.01)。如果该疾病的患者事实上只占总人口的0.5%,若某人化验结果为阳…...
ctfshow-web13 文件上传
0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面,测试其他无果,遂进行目录遍历,发现upload.php.bak文件 可以看到这里的限制条件,大小,以及内容,这里可以使用.use…...
Python项目开发案例————学生信息管理系统(附源码)
一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生的信息,并且对学生的信息进行基本的增、删、改、查操作;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…...
2023-08-25力扣每日一题
链接: 1448. 统计二叉树中好节点的数目 题意: 判断根节点到每个节点X的过程中,如果没有值大于X,则该节点为好节点,求好节点数量 解: 由于求根节点到其他节点的路径,则使用dfs算法ÿ…...
Vue3中的计算属性和属性监听
compute计算属性 Vue3中可以通过 compute进行监听计算属性,他返回的是一个ref的对象,也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…...
微信开发之一键修改群公告的技术实现
简要描述: 设置群公告 请求URL: http://域名地址/setChatRoomAnnouncement 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必…...
【git】工作场景中常用的git命令
工作场景中常用的git命令 1. 必备改名改邮箱拉代码下来并且创建新分支git commit回滚某个文件删除分支 工作场景中常用的git命令,记录下来方便调取 1. 必备 改名改邮箱 一般与他人合作,至少你提交的名字得被人熟知或者遵循规范,因此需要更改…...
Vue路由(详解)
目录 路由原理 路由到底有什么作用? 路由安装和使用(vue2) 路由跳转 跳转实例: 路由的传值和取值 传值实例: 查询参和路由参的区别: 嵌套路由 嵌套实例: 路由守卫 守卫实例࿱…...
打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因
今天,我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行,甚至崩溃。但是,请不要担心,我会为大家提供5种解决方法,帮助大家轻松解决问题。 首先,我们来看…...
关于路由器和DNS解析的一些新理解
其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的,也在一点一点的学习相关知识,每次解决一个问题,就让我对一些事情有新的思考。。 今天前台同事,的机器突然上不了网,,和领导一起去看了一波&#…...
vscode 与 C++
序 具体流程的话,官方文档里都有的:C programming with Visual Studio Code 浏览器下载一个mingw64,解压,配置环境变量vscode里安装c相关的插件没了 第一步只看文字,可能有点抽象,相关视频: …...
水果flstudio好用吗?中文版FL21最新版本如何下载
FL Studio21版是一款功能强大的音乐制作软件,广泛应用于电子音乐、流行音乐、电影配乐等领域。它提供了丰富多样的音频合成和编辑工具,使音乐制作变得更加灵活多样。无论是初学者还是专业音乐制作人,都可以通过直观的界面和丰富的音频特效来实…...
PHP is_array()函数详解,PHP判断是否为数组
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array 一、基本使用二、空数组三、同时判断多个…...
面试题-React(三):什么是JSX?它与常规JavaScript有什么不同?
在React的世界中,JSX是一项引人注目的技术,它允许开发者在JavaScript中嵌套类似HTML的标签,用于描述UI组件的结构。本篇博客将通过丰富的代码示例,深入探索JSX语法,解析其在React中的用法和优势。 一、JSX基础语法 在…...
郑州市金水区建设局网站/全国病毒感染最新消息
演示程序下载地址: 【北方网通】 【电信网通】 源代码下载地址: 【北方网通】 【电信网通】 【下载说明】 1 点击上面的地址,打开下载页面 2 点击"普通下载"--等待30秒--点击"下载"按钮--保存 点击这里查看原文 Code Project着火了!…...
用织梦系统做网站/关键词代发排名推广
String 1 :String s new String(“xyz”);创建了几个String Object? 二者之间有什么区别? 2个对象。”xyz”创建在字符串常量池中,new String()创建在堆中。 String,StringBuffer,StringBuilder区别 1、三者在执行速度上ÿ…...
深圳网站建设的客户在哪里/做一套二级域名网站怎么做
PHP1 1994年,一位名叫Rasmus lerdorf的兄台为了在网上展示自己的履历和网页流量的统计,用Perl开发了一套脚本,后来因与日俱增的需求无法得到满足,lerdorf便使用c语言进行了重写,重写后的程序支持数据库的访问ÿ…...
可以合成装备的传奇手游/搜索引擎优化的方式
但作为专业人士,此时,应该来一波专业的回答,故事的起源是这样的:从前,有家叫 Netscape 的公司开发了一个名叫 Livescript 的脚本语言,但是,开发出来之后呢?一直没啥名气。公司正当愁…...
网页展示模板/重庆seo优化公司
题目描述 给定整数m以及n各数字A1,A2,…An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个。 输入描述: 第一行包含两个整数n,m. 第二行给出n个整数A1,A2,…,An。 对于…...
网站开发哪家公司/搜索引擎和浏览器
1.枚举根节点 之前说的寻找堆中"垃圾"内存的方法是使用可达性分析算法,用一系列的GC Roots去找到引用链,进而找到已经没有用的对象,但其实现起来有两个要注意的地方 1.GC Roots往往选取全局性的引用(方法区中的常量或静态属性)和执行上下文(虚拟机栈或本地方法栈中…...