本章内容:1.一维数组的声明、初始化与使用 2.字符串 3.字符串库函数 4.二维数组的声明、初始化和使用
声明: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]); } }
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语言中将数组作为参数进行传递时,无论数据量大小,不将数组进行复制,而是直接将数组本身传入函数内部,函数内如果改变了传入的数组的值,那么函数外的那个数组的原始值也会发生改变。
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);
//gets()输入时,假如字符串中含有空格,可以输入 char str[100]; printf("请输入一串字符串\n"); gets(str); printf("输入的字符为:\n"); puts(str);
<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++; } }
定义: 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); }