第五章 数组与字符串
本章内容:1.一维数组的声明、初始化与使用 2.字符串 3.字符串库函数 4.二维数组的声明、初始化和使用
1.1 一维数组的声明、初始化和使用
声明:int scores[5]; 初始化:int scores[5]={1,2,3,4,5};或者 int scores[ ]={1,2,3,4,5};只有这两种。
使用:int scores[5]; scores[0] = 10;scores[1] = 10;scores[5] = 10;注意:这么写不正确,C语言中没有下表越界的检查机制,运行时下表越界往往会得到一些意想不到的结果。
典型算法:冒泡排序(起泡排序)可以很好的体现一维数组的初始化和使用。
//冒泡排序,从小到大
int array[] = {21,34,32,12,34,76,39};
int n = sizeof(a)/sizeof(int);
printf("冒泡排序前的数据为:\n");
for(int i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
//冒泡排序
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i;j++)
{
if(array[j]>array[j+1])
{
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
//冒泡排序后的数据
printf("冒泡排序前的数据为:\n");
for(int i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
}
1.2 数组作为函数参数
void changArrays(int array[10]){
n=10;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i;j++)
{
if(array[j]>array[j+1])
{
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
C语言中将数组作为参数进行传递时,无论数据量大小,不将数组进行复制,而是直接将数组本身传入函数内部,函数内如果改变了传入的数组的值,那么函数外的那个数组的原始值也会发生改变。
1.3 字符串
C语言中规定使用双引号引起来的字符序列为字符串。在存储字符串时结尾会加上一个NULL符号常量(' \0 '),字符串通常会以这个符号常量作为结束标志。
初始化: char str[7] = " hello! "; 或者 char str [ ] = " hello! " 或者 char str[7] = { ' h ' ,' e ',' l ',' l ',' o ',' \0 '}; 或者 char str[ ] = { ' h ' ,' e ',' l ',' l ',' o ',' \0 '};
char str[9] = "hello C!";
int i=0;
while(str[i]!=0)
{
printf("%c\n",str[i]);
i++;
}
字符串的三种输入输出方式:
1.getchar()函数和putchar()函数
//getchar()和putchar()
char str[100],c;
int i=0;
while((c=getchar()) != '\0')
{
str[i] = c;
i++;
}
str[i] = '\0';
i=0
while(str[i] != '\0')
{
putchar(str[i]);
i++;
}
//scanf()和printf()
//PS:我们在输入字符串时,如果字符串中包含空格,且后面只有一个变量接受数据,那么输入时第一个空格之后的内容将不接受
char str[100];
printf("请输入一串字符串\n");
scanf("%s",str);
printf("输入的字符串是:\n%s",str);
3.gets()和puts()函数
//gets()输入时,假如字符串中含有空格,可以输入
char str[100];
printf("请输入一串字符串\n");
gets(str);
printf("输入的字符为:\n");
puts(str);
1.4 字符函数 (包含在string.h中)
<a> 字符串库函数,首先要将string.h文件包含进去。复制:strcpy(str1,str2) 剪切:strcat(str1,str2) 计算字符串长度:strlen(str) 字符串比较:strcmp(str1,str2)
//字符串函数的使用
void charToUse()
{
char str1[100]="my name";
char str2[100]="haogaoming";
char str3[100]="my name is haogaoming";
printf("把str2复制到str1中:\n");
strcpy(str1,str2);
puts(str1);
puts(str2);
printf("把str2剪切到str1中:\n");
strcat(str1,str2);
puts(str1);
puts(str2);
printf("str1的长度:%ld\n",strlen(str1));
printf("比较str1与str3的大小:\n");
int i=strcmp(str1, str3);
if (i<0) {
printf("str3>str1");
}else if(i==0){
printf("str3=str1");
}else{
printf("str1>str3");
}
}
<b> 字符函数:(包含在ctype.h中)
//输入一段字符串,大写改成小写,小写改成大写
void changCharBigAndSmall()
{
char str[50];
int i=0;
gets(str);
while (str[i]!='\0') {
if (isupper(str[i])) {
str[i] = tolower(str[i]);
}else if(islower(str[i])){
str[i] = toupper(str[i]);
}
i++;
}
puts(str);
/*
*第二种
char str[50],c;
int i=0;
while ((c=getchar())!='\n') {
str[i] = c;
i++;
}
str[i] = '\0';
i=0;
while (str[i]!='\0') {
if (isupper(str[i])) {
str[i] = tolower(str[i]);
}else if(islower(str[i])){
str[i] = toupper(str[i]);
}
i++;
}
i=0;
while (str[i]!='\0') {
putchar(str[i]);
i++;
}
*/
}
<c> 转换函数 (包含在stdlib.h中)
将字符串转换成整型:atoi(str) 将输入的整型数字转换成字符串:itoa(x) 将字符串转换成浮点型数字:atof(str)
<d> 格式化字符串
spintf()和sscanf()。
//sprintf的使用
void howUseSsprintf()
{
char str1[20]="Hello word";
char str2[21];
sprintf(str2,"%.5s",str1);
puts(str2);
}
// PS:str2的值是Hello
//sscanf的使用
void howUseSscanf()
{
int year,month,day;
char str[]="2013/11/21";
sscanf(str,"%d/%d/%d",&year,&month,&day);
printf("%d %d %d",year,month,day);
}
//PS:year=2013,month=11,day=21
现在给出三个例子,说明字符串的声明、定义和使用:
第一个例子:在hello Word 中加入字符,重新输出
//Hello word中间假如一个字符 sscanf的使用
void helloAddChar()
{
/*
* 简单的做法
char a[20],b[11];
char str[] = "hello word";
sscanf(str,"%s%s",a,b);
puts(a);
puts(b);
strcat(a, " a ");
strcat(a, b);
puts(a);
*/
char str[20]="hello word";
char str1[11],str2[11];
char c[5] = " a";
int i=0,j=5;
while (i<5) {
str1[i] = str[i];
i++;
}
i=0;
while (j<10) {
str2[i] = str[j];
i++;
j++;
}
for (int i=0; i<20; i++) {
str[i]='\0';
}
strcat(str, str1);
strcat(str, c);
strcat(str, str2);
puts(str);
}
第二个例子:单词计数
//计算单词的个数
int countWordNum(char str[])
{
gets(str);
int i=0,isWord=0,ci=0;
while (str[i]!='\0') {
if (str[i]==' ') {
isWord = 0;
}else if (isWord==0){
isWord = 1;
ci ++;
}
i++;
}
return ci;
}
第三个例子:从给定的字符串中删除一部分后重新输出
//从给定的字符串中删除一部分
void delChar(char str[],int n,int y)
{
char str1[20];
for (int i=n; i<n+y; i++) {
str1[i-n]=str[i];
}
int i=0,j=0;
while (str[i]!='\0') {
if (str[i] == str1[j]) {
str[i] = str[n+y+i-n];
j++;
}
if (n+y+i-n>=strlen(str)) {
break;
}
i++;
}
}
1.5 二维数组的声明、定义和使用
定义: int array[10 ][10 ];
初始化:二维数组初始化时可以省略行数,但是列数不能省略。int array[2][3]={{1,2,3},{4,5,6}};或者 int array[2][3] = {1,2,3,4,5,6}; 或者 int array[ ][3] = {1,2,3,4,5,6};
使用:
#define ROWS 2
#define COLS 4
//二维数组求平均值
double twoAvage(int arry[ROWS][COLS])
{
int sum=0;
for (int i=0; i<ROWS; i++) {
for (int j=0; j<COLS; j++) {
sum +=arry[i][j];
}
}
return sum/(float)(ROWS * COLS);
}
PS:写在最后:二位数组与字符串是有关系的,可以将二维数组看成多个字符串来使用,这样我们可以解决一些复杂的字符串问题。