赞
踩
目录
思考:上述几个类型,占用多少个字节的内存?
分别如下:
注意:
举个栗子:实现一个执行10次的循环,通常是这么写:
- for(i = 0; i < 10; i++)
- {
- ……
- }
而不是这样:
- for(i = 1; i <= 10; i++)
- {
- ……
- }
这是因为我们常常需要用循环来访问数组:
- int a[10];
- for(i = 0; i < 10; i++)
- {
- a[i] = i;
- }
代码实战:尝试使用数组存放10位同学的数学成绩,并计算出平均数
- #include <stdio.h>
- #define NUM 10
-
- int main()
- {
- int s[NUM];
- int i,sum = 0;
-
- for(i = 0;i < 10; i++)
- {
- printf("请输入第%i位同学的成绩:",i + 1);
- scanf("%d",&s[i]);
- sum += s[i];
- }
-
- printf("成绩录入完毕,该次考试的平均分是:%.2f\n",(double)sum / NUM);
-
- return 0;
- }
运行结果:
int a[10] = {0};// 事实上这里只是将第一个元素赋值为0
代码举例:
- #include <stdio.h>
-
- int main()
- {
- int a[10] = {0};
- int i;
-
- for(i = 0; i < 10; i++)
- {
- printf("%d\n",a[i]);
- }
-
- return 0;
-
- }
运行结果:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
代码举例:
- #include <stdio.h>
-
- int main()
- {
- int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
- int i;
-
- for(i = 0; i < 10; i++)
- {
- printf("%d\n",a[i]);
- }
-
- return 0;
-
- }
运行结果:
int a[10] = {1, 2, 3, 4, 5, 6}; //表示前面6个元素赋值,后面4个元素系统自动初始化为0
代码举例:
- #include <stdio.h>
-
- int main()
- {
- int a[10] = {1, 2, 3, 4, 5, 6};
- int i;
-
- for(i = 0; i < 10; i++)
- {
- printf("%d\n",a[i]);
- }
-
- return 0;
-
- }
运行结果:
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
代码举例:
- #include <stdio.h>
-
- int main()
- {
- int a[] = {1, 2, 3, 4, 5, 6};
- int i;
-
- for(i = 0; i < 10; i++)
- {
- printf("%d\n",a[i]);
- }
-
- return 0;
-
- }
运行结果:
int a[10] = { [3] = 3, [5] = 5,[8] = 8 };
代码举例:
- #include <stdio.h>
-
- int main()
- {
- int a[10] = { [3] = 3, [5] = 5,[8] = 8};
- int i;
-
- for(i = 0; i < 10; i++)
- {
- printf("%d\n",a[i]);
- }
-
- return 0;
-
- }
运行结果:
补充:sizeof
代码举例:
- #include <stdio.h>
-
- int main()
- {
- int a[10] = { [3] = 3, [5] = 5,[8] = 8};
- int i;
-
- for(i = 0; i < 10; i++)
- {
- printf("%d\n",a[i]);
- }
-
- printf("%d\n",sizeof(a));
-
- return 0;
-
- }
运行结果:
数组的尺寸如果是整型常量或者整型常量表达式时,或确定其尺寸时,数组的类型就不是一个可变长度的数组;否则它就是可变长度的数组。也就是说,在C99标准时,C语言已经支持可变数组了。
注意:这里说的可变长度或者变长数组指的是数组的长度在运行时才被决定,即用变量来指定数组的长度。
代码举例1:
- #include <stdio.h>
-
- int main()
- {
- int n,i;
-
- printf("请输入字符的个数:");
- scanf("%d",&n);
-
- char a[n+1];
-
- printf("请开始输入字符:");
- getchar();
- for(i = 0;i < n;i++)
- {
- scanf("%c",&a[i]);
- }
-
- a[n] = '\0';
- printf("你输入的字符串是:%s",a);
-
- return 0;
- }
运行结果:
代码举例2:
- #include <stdio.h>
-
- int main()
- {
- int a[10],i;
-
- for(i = 0;i <= 10; i++)//此处为试错操作,开发中尽量不要出现=号,可能会出现数组越界问题
- {
- a[i] = i;
- }
-
- for(i = 0;i <= 10;i++)
- {
- printf("%d\n",a[i]);
- }
-
- return 0;
-
- }
运行结果:
注意:不要混消字符串的长度和字符串数组的大小。
- #include <string.h>
- …
- size_t strlen(const char * str );
返回值:
注意: size_t 被定义于 stddef.h 头文件中,它事实上就是无符号整形(unsigned int)
代码举例:
- #include <stdio.h>
- #include <string.h>
-
- int main()
- {
- char str[] = "I love C!";
-
- printf("sizeof str = %d\n",sizeof(str));
- printf("strlen str = %u\n",strlen(str));
-
- return 0;
-
- }
运行结果:
(1)strcpy
使用此函数一定要保证目标字符串(目标字符数组)的长度要足以容纳源字符串(源数组)。否则,会出现问题(但不报错)。
代码举例:
- #include <stdio.h>
- #include <string.h>
-
- int main()
- {
- char str1[] = "Original String";
- char str2[] = "New String";
- char str3[100];
-
- strcpy(str1,str2);//①
- strcpy(str3,"Copy Successful");
-
- printf("str1:%s\n",str1);
- printf("str2:%s\n",str2);
- printf("str3:%s\n",str3);
-
- return 0;
- }
运行结果:
若将上述代码①处改为:strcpy(str2,str1); 则会有问题产生。因此在程序实现拷贝的时候,应该限制源字符串的长度,确保目标字符串在执行完拷贝之后不会发生溢出。此时即可使用strncpy。
(2)strncpy
①函数概要
和 strcpy 函数一样,strncpy 函数将拷贝源字符串的 n 个字符到目标数组中,如果源字符串的长度小于 n,那么就用 '\0' 填充额外的空间。如果源字符串的长度大于或等于 n,那么只有 n 个字符被拷贝到目标数组中(注意:这样的话将不会以结束符 '\0' 结尾)。
代码举例:
- #include <stdio.h>
- #include <string.h>
-
- int main()
- {
- char str1[] = "To be or not to be";
- char str2[40];
-
- strncpy(str2, str1, 5);//参数5用于限制拷贝的长度
- str2[5] = '\0';//①
-
- printf("str2:%s\n",str2);
-
- return 0;
-
- }
运行结果:
要求目标数组中已经包含一个字符串(可以是空字符串),它会找到该字符串的末尾,并将源字符串连接过去。
代码举例:
- #include <stdio.h>
- #include <string.h>
-
- int main()
- {
- char str1[] = "I love";
- char str2[] = "C!";
-
- strcat(str1, " ");
- strcat(str1,str2);
-
- printf("str1: %s\n",str1);
-
- return 0;
-
- }
运行结果:
注意:strncat与strncpy不同,它总是在连接后面会自动加一个结束符 '\0' ,
(1)strcmp
代码举例:
- #include <stdio.h>
- #include <string.h>
-
- int main()
- {
- char str1[] = "FishC.com!";//①
- char str2[] = "FishC.com!";
-
- if(!strcmp(str1,str2))
- {
- printf("两个字符串完全一致!\n");
- }
- else
- {
- printf("两个字符串存在差异!\n");
- }
-
- return 0;
-
- }
运行结果:
若将上述代码①出的大写C 改为 小写c,则运行结果如下:
(2)strncmp
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。