栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言错题整理5-2021-10.4

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言错题整理5-2021-10.4

1-各种类型的长度和取值范围


2-一维/二维数组/数组指针
数组指针
1.&a[i][j]-------数组元素a[i][j]的地址
2.&a[i]---------数组元素a[i][0]的地址
3.a[0]+j--------数组元素a[0][j]的地址
4.*(*(a+i)+j)----数组元素a[i][j]的地址
5.*(a[i]+j) -----数组元素a[i][j]的地址
6. &a ----------数组的地址
7. a[0] --------数组首行首元素地址(二维数组中)
8. a -----------数组首行地址
数组名是常指针,不能改,例如:a++

3-strlen与sizeof

char *a="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};

char str1[8] = {'a', 's', 'd'};
char str2[20] = “0123456789”;
int  str3[20] = “0123456789”;
char str4[] = "asdf";
string str5={‘a’,‘b’,‘c’,’0’,‘X’};

sizeof(a)=4;  strlen(a)=6;
sizeof(d)=7;  strlen(d)=6;
sizeof(e)=6;  strlen(e)=14;
sizeof(str1) = 8;   strlen(str1) = 3;
sizeof(str2) = 20;  strlen(str2) = 10;
sizeof(str3) = 80;  strlen(str3) = error;
sizeof(str4) = 6;  strlen(str4) = 2;
sizeof(str5) = 5;  strlen(str5) = 3;

当以字符串赋值时,“abcdef”,结尾自动加一个"/0".
strlen(a)遇到/0就会结束,求的是字符串的长度,为6,sizeof(a)求的是类型空间大小,在前面说过,指针型所点的空间大小是4个字节,系统地址总线长度为32位时。
strlen(d)也是一样,字符串赋值,自动添加/0,求字符串的长度当然是6,sizeof(d)是求这个数组所占空间的大小,即数组所占内存空间的字节数,应该为7.
sizeof(e), 数组e以单个元素赋值,没有/0结束符,所以所占空间的大小为6个字节,strlen(e),去找/0结尾的字符串的长度,由于找不到/0,所以返回的值是一个不确定的值。

str1是也是字符数组,但大小确定为 8,故 sizeof 得到的结果是 8;strlen 统计 之前所有字符的个数,即为 3;
str2 中sizeof(test) 为20,test表示在内存中预分配的大小,20x1,strlen(test) 为 10,在遇到’’字符就结束循环;
str3 中sizeof(test) 为80,int 在内存中占4个字节,故分配的内存为 20x4,strlen(test) 报错,因为stelen 接受的参数只能为char ,且必须是以’’结尾,而此例子为int *;
str4 是常量字符数组,sizeof 得到字符总数即 6;strlen 计算至 结束,因此返回 2;
总结一句就是 sizeof 计算的是变量的大小,而 strlen 计算的是字符串的长度,前者不受字符 影响,后者以 作为长度判定依据。

4-原码,反码,补码

正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1 ] = [10000001]原 = [11111110]反

正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1 ] = [10000001]原 = [11111110]反 = [11111111]补

5-位运算与逻辑运算


6-break与continue

int array[10] = {5,3,2,6,4,7,9,8,0,1};
int i;
for (i = 0; i < 10; i++)
{
    if (array[i] == 7)
    {
        printf("%dn", i);
        break;
    }
}

在循环体中通过if语句找到数组中值为7的下标并显示其值,当然后通过break语句跳出循环,也就是说当程序执行break语句时将结束整个循环,而本应该继续循环的内容将不会被执行。上面程序中执行6次循环,i的值为5,然后剩下的内容不执行,直接结束。

int array[10] = {5,3,2,6,4,7,9,8,0,1};
int i;
for (i = 0; i < 10; i++)
{
    if (array[i] < 5)
    {
        continue;
    }
    printf("%dn", i);
}

但是在if中我们判断如果数组中变量的值小于5时则执行continue语句,于是结束本次循环,进入下一次循环,所以只有当大于等于5时都会执行printf语句,所以结果为:
0 3 5 6 7

break:跳出循环语句,执行后面的代码
continue:终止本次循环,进行下一次循环。

7-strcpy/strcat/strcmp

#include 
#include 

int main()
{
	char str[32] = "helloworld";
	char ptr[32] = "12345";

	strcpy(str, ptr);   //把数组ptr的数据拷贝到数组str里面 包括''
	printf("%sn", str);

	strncpy(str, ptr, 3);
	printf("%sn", str);

	strncpy(str + 1, ptr + 3, 2);
	printf("%sn", str);

	strcat(str, ptr);    //把ptr数组里面的数据连接到str后面
	printf("%sn", str);

	strncat(str, ptr + 1, 3);
	printf("%sn", str);

	if (strcmp(str, ptr) > 0)      //字符串比较
	{
		printf("%s > %sn", str, ptr);
	}
	else
	{
		printf("%s < %sn", str, ptr);
	}

	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297445.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号