C语言常见错误汇总

文章列举了在C语言编程中容易犯的三个错误:1)使用sizeof(a)代替sizeof(a)/sizeof(a[0])计算数组长度,可能导致数组越界;2)函数定义时误用逗号运算符;3)在fgets函数中错误地使用strlen作为缓冲区大小。并提供了修正后的代码示例。
摘要由CSDN通过智能技术生成

1 数组遍历时使用sizeof(a)

任务:有个数组,找出第二大的数,并且打印出来(使用*操作数组元素个数,不要使用[])

#include<stdio.h>
int main01()
{
	int a[] = { 100,100,100,234,123,500,32,68,41,99,13,71 };
	//冒泡排序,但只需要执行两轮

	int temp;

	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < sizeof(a) - i - 1; j++)
		{
			if (*(a + j) > *(a + j + 1))
			{
				temp = *(a + j);
				*(a + j) = *(a + j + 1);
				*(a + j + 1) = temp;
			}
		}
	}
	
	printf("%d\n", *(a + sizeof(a) - 2));
	return 0;
}

在内循环遍历数组a时,不需要遍历最后一个元素,首轮只需要遍历到倒数第二个元素,但上面的程序执行时可能会报错(也有可能不报错,具体要看编译器),原因是数组的长度不是sizeof(a),而是sizeof(a)/sizeof(a[0]),sizeof(a)仅仅是数组占用了多少个字节,这样会导致数组越界,污染内存。
应该改为

#include<stdio.h>
int main01()
{
	int a[] = { 100,100,100,234,123,500,32,68,41,99,13,71 };
	//冒泡排序,但只需要执行两轮

	int temp;

	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < sizeof(a)/sizeof(a[0]) - i - 1; j++)
		{
			if (*(a + j) > *(a + j + 1))
			{
				temp = *(a + j);
				*(a + j) = *(a + j + 1);
				*(a + j + 1) = temp;
			}
		}
	}
	
	printf("%d\n", *(a + sizeof(a) / sizeof(a[0]) - 2));
	return 0;
}

2 函数定义时使用了逗号

void my_strcpy(char dst[], char src[]);
{
	int i = 0;
	while (*(src + i) != '\0')
	{
		*(dst + i) = *(src + i);
		i++;
	}
	*(dst + i) = '\0';
}

函数首行使用了逗号,这个在定义函数时,将函数声明复制过来的时候,经常出现这个错误,而且报错往往是在第二行,使得错误难以发现
在这里插入图片描述

3 fgets第二个参数写成strlen

我们在学习的时候,fgets的使用格式为

char str[10];
fgets(str, sizeof(str), stdin);

但我好几次将sizeof写成了strlen,导致发生了错误。例如下面的案例

需求:数量两个字符串,比较其是否相等

#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>

int main() {
	char str1[64] = "";
	char str2[64] = "";
	printf("请输入字符串1:");
	fgets(str1, strlen(str1), stdin);
	str1[strlen(str1) - 1] = 0;

	printf("请输入字符串2:");
	fgets(str2, strlen(str2), stdin);
	str2[strlen(str2) - 1] = 0;

	int i = 0;
	while (str1[i] == str2[i] && str1[i] != 0 && i<63) //i<63,即只考虑下标0-62,63默认留给'\0'
		i++;
	if (i == strlen(str2))
		printf("字符串相等\n");
	else
		printf("字符串不相等\n");

	return 0;
}

曝出如下错误信息:
0x00007FF6F855324D 处有未经处理的异常(在 day04_array.exe 中): RangeChecks 检测代码检测到超出范围的数组访问。
在这里插入图片描述
关键原因是使用了strlen,因为str1和str2初始化时,整个数组都是’\0’,使得strlen(str1)就是0,出现这种参数时,fgets函数将报错。
在这里插入图片描述
修改如下:

#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>

int main() {
	char str1[64] = "";
	char str2[64] = "";
	printf("请输入字符串1:");
	fgets(str1, sizeof(str1), stdin);
	str1[strlen(str1) - 1] = 0;

	printf("请输入字符串2:");
	fgets(str2, sizeof(str2), stdin);
	str2[strlen(str2) - 1] = 0;

	int i = 0;
	while (str1[i] == str2[i] && str1[i] != 0 && i<63) //i<63,即只考虑下标0-62,63默认留给'\0'
		i++;
	if (i == strlen(str2))
		printf("字符串相等\n");
	else
		printf("字符串不相等\n");

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值