一、一维数组
1.数组名表示内存首地址,是地址常量。
2.sizeof(数组名)是数组占用的总内存空间。
3.编译时分配连续内存,内存字节数=数组维数*sizeof(元素数据类型)。
4.数组不初始化,其元素值为随机数。
5.对static数组元素不赋初值,系统会自动赋以0值。
static int a[5];等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0;
二、二维数组
1.定义方式:数据类型 数组名[常量表达式][常量表达式];
2.行可以省略列不可。
3.字符串结束标志:'\0'。
#include <stdio.h>//杨辉三角
int main(int argc, char *argv[])
{
int a[10][10] = {{0}};
int i, j;
for (i = 0; i < 10; i++) {
a[i][0] = 1;//第一列赋1
for (j = 1; j <= i; j++)
a[i][j] = a[i-1][j-1] + a[i-1][j];//赋值
}
for (i = 0; i < 10; i++) {
for (j = 0; j <= i; j++)//使输出的列数小于等于行数
printf("%-8d ", a[i][j]);//%-8d左对齐,右边空8个空格
putchar('\n');//空格
}
return 0;
}
字符串逆序输出
#include <stdio.h>
int main(int argc, char *argv[])
{
char arr[] = "welcome";
int i, n;
n = sizeof(arr)/sizeof(char);//字符串个数
for (i = n-1; i >= 0; i--)
putchar(arr[i]);
putchar('\n');//换行
return 0;
}
输入一个字符逆序输出
#include <stdio.h>
#include <string.h>
#define N 20
int main(int argc, char *argv[])
{
//char arr[] = "welcome";
char arr[N] = {0};
int i, n;
printf("Please input a string:");
gets(arr);
n = strlen(arr);
for (i = n-1; i >= 0; i--)
putchar(arr[i]);
putchar('\n');
return 0;
}
#include <stdio.h>
#include <string.h>
#define N 20
int main(int argc, char *argv[])
{
char arr[N] = {0};
int i, j, n, ch;
printf("Please input a string:");
gets(arr);
n = strlen(arr);
i = 0;
j = n-1;
while (i < j) {
ch = arr[i];
arr[i] = arr[j];
arr[j] = ch;
i++;
j--;
}
puts(arr);
return 0;
}
三、字符串函数
1.字符串长度函数strlen
格式:strlen(字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内
\xhh表示十六进制数代表的符号
\ddd表示8进制的
例:对于以下字符串,strlen(s)的值为:
char s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};
char s[ ]=“\t\v\\\0will\n”;//特殊字符遇到strlen不算
char s[ ]=“\x69\141\n”;
答案:1 3 3
#include <stdio.h>
#include <string.h>
int main()
{
char s1[] = "makeru";
printf("%d\n",strlen(s1));//字符串长度,不带'\0',长度为6
printf("%d\n",sizeof(s1)/sizeof(char));//带'\0',ca'长度为7
return 0;
}
2.字符串拷贝函数strcpy
格式:strcpy(字符数组1,字符串2)
功能:将字符串2,拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明:
字符数组1必须足够大
拷贝时‘\0’一同拷贝
#include <stdio.h>
#include <string.h>
#define N 30
int main()
{
char src[] = "makeru";
char dest[N];
int i, n;
strcpy(dest, src);
//i = 0;
//n = strlen(src);
//printf("n=%d\n",n);
//while(i <= n){//和strcpy的效果是一样的
// dest[i] = src[i];
// i++;
//}
puts(src);
puts(dest);
return 0;
}
3.字符串连接函数strcat
格式:strcat(字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:
字符数组1必须足够大
连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串最后加‘\0’
4.字符串比较函数strcmp
格 式:strcmp(字符串1,字符串2)
功 能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止
返 值:返回int型整数
a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
#include <stdio.h>
#include <string.h>
int main()
{
char s1[] = "aa";
char s2[] = "abc";
printf("%d\n", strcmp(s1,s2));
return 0;
}
拓展
strncpy(p, p1, n) 复制指定长度字符串
strncat(p, p1, n) 附加指定长度字符串
strcasecmp忽略大小写比较字符串
strncmp(p, p1, n) 比较指定长度字符串
strchr(p, c) 在字符串中查找指定字符(strchr(p, c) 反向查找)
strstr(p, p1) 查找字符串
isalpha() 检查是否为字母字符
isupper() 检查是否为大写字母字符
islower() 检查是否为小写字母字符
isdigit() 检查是否为数字
编程题:从终端输入10个数字(乱序),利用简单选择排序法对这10个数字排序,结果从小到大排列。
(温馨提示:冒泡排序和简单选择排序是两个不同的原理。)
#include <stdio.h>//简单排序法
#include <string.h>
int main()
{
int table[10] = {0};
int i=0,j=0,ch;
printf("请输入10个数字:");
for(i=0;i<10;i++){
scanf("%d", &table[i]);
}
printf("输入的数字是: ");
for(i=0;i<10;i++){
printf("%d ",table[i]);
}
printf("\n");
for(i=0;i<9;i++){
for(j=i+1;j<10;j++) {
if(table[i]>table[j])
{
ch = table[i];
table[i] = table[j];
table[j] = ch;
}
}
}
printf("简单选择排序后:");
for(i=0;i<10;i++){
printf("%d ",table[i]);
}
printf("\n");
return 0;
}