【基础C】区别 = 与 == 、 scanf使用报错、 <= x <= 与x >= && x >=、数组中使用变量名、 区分 sizeof 与 strlen——常见的编译错误及经验积累(一)

目录

①  区别 = 与 == 

②   scanf使用报错(C4996)

③  <= x <= 与x >= && x >=

④  数组中使用变量名(E0028)

⑤  区分 sizeof 与 strlen

每个人的代码能力都是随着code不断积累的,只有在独自敲代码然后运行之后才能发现自己隐藏的小错误,我在最开始学习的时候就是只听课不敲代码,到最后自己写的时候立马就现原形了,所以说呢,平时的经验积累是非常重要的,以下是我认为对于初学者来说比较常见且经典的错误👌

 


①  区别 = 与 == 

错误示范:

 诶,这里n = 1才会打印,为什么n = 0 的时候也打印出来了呢?

首先我们来 区分 = 与 ==  :

=   为赋值操作符

==   为关系操作符

 简单来说=是赋值,==是判断,区分这个是很简单,但是稍有不注意就会写错,如果你要写的代码非常复杂,当你写错了=与==你还是会改很久的bug,所以说这一点是不能小看的!

正确示范:

②   scanf使用报错(C4996)

方法一:

如果你用的是 Visual Studioscanf 换成 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✔️

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dusong_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值