目录
每个人的代码能力都是随着code不断积累的,只有在独自敲代码然后运行之后才能发现自己隐藏的小错误,我在最开始学习的时候就是只听课不敲代码,到最后自己写的时候立马就现原形了,所以说呢,平时的经验积累是非常重要的,以下是我认为对于初学者来说比较常见且经典的错误👌
① 区别 = 与 ==
错误示范:
诶,这里n = 1才会打印,为什么n = 0 的时候也打印出来了呢?
首先我们来 区分 = 与 == :
= 为赋值操作符
== 为关系操作符
简单来说=是赋值,==是判断,区分这个是很简单,但是稍有不注意就会写错,如果你要写的代码非常复杂,当你写错了=与==你还是会改很久的bug,所以说这一点是不能小看的!
正确示范:
② scanf使用报错(C4996)
方法一:
如果你用的是 Visual Studio 将 scanf 换成 scanf_s
但这个方法不是很推荐,因为scanf_s只在vs上管用,如果你用的是其他的汇编软件,就不会有scanf_s这样的输入方式。
※ 方法二:
• 在文件中找到 newc++file.cpp
(C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\VC\VCProjectItems)
• 复制到桌面打开他,如图,他是没有任何内容的,
• 将下面一段代码输入到其中⬇️
#define _CRT_SECURE_NO_WARNINGS 1
• 输入完成之后将其保存并拖入之前的文件位置中,替换之前的 newc++file.cpp
• 之后你每当创建一个程序他就会有上面这串代码了,相当于屏蔽掉scanf的警告,你也就可以直接使用scanf了✔️
③ 表达 <= x <= 错误
错误示范:
#include<stdio.h>
int main()
{
int n = 10;
if (2 <= n <= 5)
printf("n大于2小于5");
else
printf("n不在该范围内");
return 0;
}
运行结果:
显然这里的n = 10是大于5的,但是却打印了"n大于2小于5",为什么会这样呢?⬇️
• 我们看看上述例子 if语句 中的判断条件:(2 <= n <= 5)
从左到右,首先判断 2 <= n 如果条件成立,该表达式的值则变成 1,之后在判断后半段表达式,及 1 <= 5 ,毫无疑问这是成立的,所以上述程序会进入if语句内,然后打印。
• 我们可以改变 if语句的判断条件 来验证 2 <= n 成立后会变成1⬇️
正确示范:
#include<stdio.h>
int main()
{
int n = 10;
if (n >= 2 && n <= 5)
printf("n大于2小于5");
else
printf("n不在该范围内");
return 0;
}
运行结果:
④ 数组中使用变量名及无常量值(E0028)
以C99标准:
C99之前,数组的大小不能使用变量;
C99中引入了变长数组的概念,这时候数组的大小就可以使用变量了。
错误示范:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++)
{
a[i] = i;
}
return 0;
}
如果你输入一个数n,创建一个大小为n的数组,此时系统会报错——表达式必须含有常量值;
方法一:#define
#include<stdio.h>
#define N 10
int main()
{
int a[N];
for (int i = 0; i < N; i++)
{
a[i] = i;
}
return 0;
}
※ 方法二:动态开辟
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int* a = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
{
a[i] = i;
}
for (int j = 0; j < n; j++)
{
printf("%d", a[j]);
}
return 0;
}
⑤ 区分 sizeof 与 strlen
※
strlen是字符串函数,用来求字符串的长度
strlen函数计算字符串大小时通过 \0 判断结束,我们来看看使用时可能发生的错误⬇️
#include<stdio.h>
#include<string.h>
int main()
{
char a1[] = { "Dusong" };
char a2[] = { 'D','u','s','o','n','g' };
printf("%d\n", strlen(a1));
printf("%d\n", strlen(a2));
return 0;
}
能看出,a1与a2的长度都为6,那我们看看运行结果⬇️
为什么字符数组a2的长度是34呢?我们打开监视窗口看看数组里面究竟是什么个情况⬇️
• 之前我们说过strlen函数遇到 '\0' 会停止计数,那么由图我们可以看出,数组a1里的字符串每一个字符占据了数组的一个空间,而在字符串的最后会自动增添一个位置用来存放 '\0'
• 而a2数组中并没有 '\0' ,所以说strlen在计算改数组长度时,从第一个数开始,一直计算到数组中出现' \0 ' ,而他在何时何地出现我们并不知道,所以a2计算出的数组长度是个随机值✔️
解决方法:
方法一:
在a2数组最后添加 ' \0 '
char a2[] = { 'D','u','s','o','n','g', '\0'};
方法二:
在数组的[]中写入一个大于等于字符个数的一个数
char a2[10] = { 'D','u','s','o','n','g'};
※
在最开始学习的时候,我偶尔会将strlen与sizeof两者搞混,这两者可以说是都是拿来计算大小长度的,但是差别巨大🤔
sizeof时单目操作符,用来计算变量所占内存大小(单位:字节)
用之前的例子,一个字符占据一个字节的空间⬇️
#include<stdio.h>
int main()
{
char a1[] = { "Dusong" };
char a2[] = { 'D','u','s','o','n','g'};
printf("%d\n", sizeof(a1));
printf("%d\n", sizeof(a2));
return 0;
}
运行结果:
sizeof 与 strlen 不同,sizeof直接计算数组空间大小⬇️
用sizeof计算数组中的元素个数:
int占据四个字节,所以上述数组大小(s_size)为4×5 = 20;
sizeof( a ) 表示整个数组的大小,sizeof( a[0] ) 表示数组中的第一个元素的大小,将两者向除就得可以得出数组中元素得个数了。
※
总之呢,一般情况下,计算字符串时用strlen,计算其他数组大小或者长度时用sizeof✔️