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;
}