文章目录
笔记
字符数组
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即′\0′)。
C系统在用字符数组存储字符串常量时会自动加一个′\0′作为结束符。
在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。
如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度。
char c[]={"I am happy"};
或 char c[]="I am happy";
用一个字符串(注意字符串的两端是用双引号而不是单引号括起来的)作为字符数组的初值。
数组c的长度不是10,而是11。因为字符串常量的最后由系统加上一个′\0′
。
char c[]={′I′, ′ ′, ′a′,′m′, ′ ′,′h′,′a′,′p′,′p′,′y′,′\0′}
;
不等于
char c[]={′I′, ′ ′, ′a′,′m′, ′ ′,′h′,′a′,′p′,′p′,′y′}
;
char c[10]={"China"}
;
数组c的前5个元素为: ′C′,′h′,′i′,′n′,′a′,第6个元素为′\0′,后4个元素也自动设定为空字符。
字符数组输出
(1) 逐个字符输入输出。用格式符“%c”输入或输出一个字符。
(2) 将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串(string)的输入输出。
(1) 输出的字符中不包括结束符′\0′。
(2) 用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
(3) 如果数组长度大于字符串的实际长度,也只输出到遇′\0′结束。
(4) 如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
字符串处理函数
输入字符串的函数 gets()
gets(str); //str是已定义的字符数组
如果从键盘输入:
Computer↙
将输入的字符串″Computer″送给字符数组str(请注意,送给数组的共有9个字符,而不是8个字符)
字符串连接函数–strcat
作用:把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。
字符数组1必须足够大,以便容纳连接后的新字符串。
连接前两个字符串的后面都有′\0′,连接时将字符串1后面的′\0′取消,只在新串最后保留′\0′。
字符串赋值函数–strcpy
作用:将字符串2复制到字符数组1中去。
字符数组1必须定义得足够大,以便容纳被复制的字符串2。字符数组1的长度不应小于字符串2的长度。
“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名,也可以是一个字符串常量。
若在复制前未对字符数组1初始化或赋值,则其各字节中的内容无法预知,复制时将字符串2和其后的′\0′一起复制到字符数组1中,取代字符数组1中前面的字符,未被取代的字符保持原有内容。
不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。字符数组名是一个地址常量,它不能改变值,正如数值型数组名不能被赋值一样。
错误
str1="China"; str1=str2;
可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。
strncpy(str1, str2, 2);
将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符。但复制的字符个数n不应多于str1中原有的字符(不包括′\0′)。
字符串比较函数—strcmp
作用:比较字符串1和字符串2。
字符串比较的规则是: 将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到′\0′为止。
(1) 如全部字符相同,则认为两个字符串相等;
(2) 若出现不相同的字符,则以第1对不相同的字符的比较结果为准。比较的结果由函数值带回。
(1) 如果字符串1与字符串2相同,则函数值为0。
(2) 如果字符串1>字符串2,则函数值为一个正整数。
(3) 如果字符串1<字符串2,则函数值为一个负整数。
对两个字符串比较不能直接用str1>str2进行比较
因为str1和str2代表地址而不代表数组中全部元素,而只能用 (strcmp(str1,str2)>0)
实现
系统分别找到两个字符数组的第一个元素,然后顺序比较数组中各个元素的值。
测字符串长度的函数–strlen
作用:测试字符串长度的函数。函数的值为字符串中的实际长度(不包括′\0′在内)。
转换为大小写的函数
strlwr(字符串) 大转小
strupr(字符串) 小转大
EG 1
对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
#include <stdio.h>
void main()
{int i=0,a[10];for(;i<10;i++){a[i]=i;}for(i=9;i>=0;i--){printf("%d\t",a[i]);}
}
EG 2
计算斐波那契数列
#include <stdio.h>
void main()
{int i=0,f[40]={1,1};// i 从2开始for(i=2;i<40;i++){f[i]=f[i-1]+f[i-2];}for(i=0;i<40;i++){if(i%5==0) printf("\n");printf("%d\t",f[i]);}
}
EG 3 排序
排序
冒泡排序
#include <stdio.h>
void main()
{void bubbleSort(int *arr);printf("请输入:");int i=0,j,arr[5];while((i-5)!=0){scanf("%d",&arr[i]) ;i++;}bubbleSort(arr);printf("排序后的数组为:\n");for (j = 0; j<5; j++)printf("%d ", arr[j]);printf("\n");
}void bubbleSort(int *arr)
{int i,j,tmp;for(i=0;i<5-1;i++){for(j=0;j<5-1-i;j++){if(arr[j]>arr[j+1]){tmp = arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;}}}
}
不用函数
#include<stdio.h>
#include<math.h> int main()
{int a[10];int i,j,t;printf("input 10 words");for(i=0;i<10;i++){scanf("%d",&a[i]);}for(i=0;i<10;i++){for(j=1;j<10-i;j++){if(a[j-1]<a[j]){t=a[j-1];a[j-1] = a[j];a[j] =t;}}}for(i=0;i<10;printf("%d\t",a[i]),i++);return 0;
}
? int *a 与 int b[]
相同点
a和b的值都表示**一片内存区域的地址**,都是使用*nt型进行管理
作为函数的形式参数没有任何区别
区别
a是一个变量,需要分配内存空间进行存储而b是程序中的一个标号,给编译器提供地址信息,不需要进行保存。因此可以在程序中 改变a,但是无法在程序中改变b。
可以使用int b[]定义数组,如 int b[] = {1, 2, 3, 4},
但是无法使用int *a定义数组 int *a = {1, 2, 3, 4} //语法错误。
EG 4
转置矩阵
#include <stdio.h>int main()
{int a[2][3] = {{1,2,3},{4,5,6}};int b[3][2],i,j;printf("array a = \n");for(i=0;i<2;i++){for(j=0;j<3;j++){printf("%5d",a[i][j]) ;b[j][i] = a[i][j];}printf("\n");}printf("\n");printf("array b = \n");for(i=0;i<3;i++){for(j=0;j<2;j++){printf("%5d",b[i][j]) ;}printf("\n");}
}
EG 5
求一个3-4矩阵的最大值并输出下标
#include <stdio.h>int main()
{double a[3][4];int i,j;printf("请输入 \n");for(i=0;i<3;i++){for(j=0;j<4;j++){scanf("%lf",&a[i][j]) ;}}printf("\n");printf("输入的矩阵 = \n");for(i=0;i<3;i++){for(j=0;j<4;j++){printf("%lf\t",a[i][j]) ;}printf("\n");}printf("\n");double max = 0;int row,rol;for(i=0;i<3;i++){for(j=0;j<4;j++){if(a[i][j]>max) {max = a[i][j];row = i;rol = j;}}}printf("最大值是%lf \n",max);printf("坐标是%d,%d \n",row,rol);return 0;
}
EG 6
输出一个已知的字符串。
#include <stdio.h>
int main()
{char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};int i;for(i=0;i<15;i++)printf("%c",c[i]);printf("\n");return 0;
}
EG 7
菱形图
#include <stdio.h>
int main()
{ char diamond[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};int i,j;for (i=0;i<5;i++){ for (j=0;j<5;j++)printf("%c",diamond[i][j]);printf("\n");}return 0;
}
EG 8
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{char string[100];int i,num=0,word=0;char c;gets(string);for(i=0;(c=string[i])!='\0';i++) {if(c==' ')word = 0;else if(word==0){word=1;num++;} }printf("There are %d words in this line.\n",num); //输出单词数}
EG 9
有3个字符串,要求找出其中“最大”者。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{char str[3][100];char string[20];int i;for(i=0;i<3;gets(str[i]),i++);
// for(i=0;i<3;i++)
// gets(str[i]); if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);else strcpy(string,str[1]); if(strcmp(str[2],string)>0) strcpy(string,str[2]); printf("\nthe largest string is:\n%s\n",string);
}
习题 1
- 用筛选法求100之内的素数
筛选法:又称为筛法。先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)
#include<stdio.h>
int main()
{int i,j,k;int a[100];for (i = 0; i < 100; i++)a[i] = i+1;// 因为1是素数,把a[0]用0标记// 最后一个位置数字是100,100不是素数,因此循环可以少循环一次a[0] = 0;for(i=0;i<99;i++){// 用a[i]位置的数字去模i位置之后的所有数据// 如果能够整除则一定不是素数,该位置数据用0填充for (j = i + 1; j < 100; j++){if (a[i] != 0 && a[j] != 0){//把不是素数的都赋值为0if (a[j] % a[i] == 0)a[j] = 0;} }}printf(" 筛选法求出100以内的素数为:\n");for (i = 0; i < 100; i++){//数组中不为0的数即为素数if (a[i] != 0)printf("%3d", a[i]);}printf("\n");return 0; }
习题 2 选择排序
用选择法对10个整数排序
选择排序
#include<stdio.h>
int main()
{int array[10]={1,4,6,89,3,45,56,89,32,56};int i, j, k, tmp;//求长度 int size = sizeof(array) / sizeof(array[0]);for (i = 0; i < size - 1; i++) {k=i;//找最小的过程 for (j = i + 1; j < size; j++) {if (array[j] < array[k]) {k = j;}}
// 把最小的数字给arr[i] tmp = array[k];array[k] = array[i];array[i] = tmp; }printf("排序后的结果:") ;for (i = 0; i < size ; i++) {printf("%d\t",array[i]) ;}return 0; }
习题 3
求一个3 X 3的整形矩阵对角线元素之和
#include<stdio.h>
int main()
{int array[3][3];int i, j, sum=0;printf("请输入3-3矩阵");for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {scanf("%d",&array[i][j]); }}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {printf("%d\t",array[i][j]);if (i==j) {sum+=array[i][j];}}printf("\n");}printf("sum = %d\t",sum);return 0;
}
习题 4 插入排序
有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中
插入排序
从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
#include<stdio.h>
int main()
{int num=0;int array[100] = {1,2,55,66,77,89,90,455,789,4556};printf("请输入一个整数:");scanf("%d", &num);int j=9;while(j >= 0 && (array[j]>num)){ array[j+1] = array[j]; printf("把原来第%d位的%d赋值给第%d位\n",j+1,array[j],j+2);j--;} printf("第%d位数%d小于%d,把%d插到第%d位\n",j+1,array[j],num,num,j+2);array[j+1] = num; for (j = 0 ; j<11; j++) { printf("%d\t",array[j]);} return 0;
}
结果
请输入一个整数:4
把原来第10位的4556赋值给第11位
把原来第9位的789赋值给第10位
把原来第8位的455赋值给第9位
把原来第7位的90赋值给第8位
把原来第6位的89赋值给第7位
把原来第5位的77赋值给第6位
把原来第4位的66赋值给第5位
把原来第3位的55赋值给第4位
第2位数2小于4,把4插到第3位
1 2 4 55 66 77 89 90 455 789 4556
--------------------------------
Process exited after 3.589 seconds with return value 0
请按任意键继续. . .
习题 5
将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
- 简单版
#include<stdio.h>
int main()
{int a[5] = {8,6,5,4,1};int b[5],i;for(i=0;i<5;i++){b[4-i]=a[i];}for(i=0;i<5;i++){printf("%d",b[i]) ;}return 0;
}
- 升级版本
如果begin < end时,则循环进行一下操作
给定两个下标begin和end,begin放在数组起始的位置,end放在数组最后一个元素的位置
交换begin和end位置的元素
begin往后移动,end往前移动
#include <stdio.h>void main()
{int array[5] = {8,6,5,4,1};int begin = 0, end = 4;int i;printf("逆序之前数组为:");for (i = 0; i < 5; ++i)printf("%d ", array[i]);printf("\n");while(begin<end){int temp = array[begin];array[begin] = array[end];array[end] = temp;begin++;end--;}printf("逆置之后数组为:");for ( i = 0; i < 5; ++i)printf("%d ", array[i]);printf("\n");}
- 复杂版本
手动输入—
#include<stdio.h>
int main()
{int i=0,n;int a[100],b[100] ;printf("输入长度:");scanf("%d",&n);printf("输入数字:");for(i=i;i<n;i++){scanf("%d",&a[i]); }for(i=0;i<n;i++){b[n-i-1]=a[i];}for(i=0;i<n;i++){printf("%d\t",b[i]) ;}
}
- 地狱版本
不定长数组的输入问题C/C++实现
动态规划
#include<stdio.h>
#include <stdlib.h>
#include <string.h>void main(void)
{ int i =0;char c;int count = 10;int *a = (int*)malloc(10*sizeof(int));//初始分配10个大小的空间int n;while( scanf("%d",&n)){a[i] = n;i++;if((c = getchar()) == '\n')break;if(i>=count){a = (int *)realloc(a,(i+10)*sizeof(int));//当空间不够,继续追加count += 10;}}for(int j = 0; j<i;j++)printf("%d ",a[j]);system("pause");return;
}
习题 6
- 输出一下的杨慧三角(要求输出10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include<stdio.h>
int main()
{int i,j,a[6][6];for(i=0;i<6;i++){for(j=0;j<=i;j++){if((i==j)||(j==0))a[i][j]=1;elsea[i][j] = a[i-1][j]+a[i-1][j-1];}}for ( i = 0; i < 6; ++i){for ( j = 0; j <= i; ++j){printf("%5d", a[i][j]);}printf("\n");}
}
习题 7
输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:
8 1 6
3 5 7
4 9 2
要求输出1~n^2 的自然数构成的魔方阵。
————————————————
魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n ^ 2 − 1 个数依次按下列规则存放:
将1放在第1行的中间一列。
从2开始直到n*n止,各数依次按此规律存放:每一个数存放的行比前一个数的行数减1,列数加1。
如果上一行的行数为1,则下一个数的行数为n(指最下一行)。
当上一个数的列数为n时,下一个数的列数应该为1。
如果按上面规律确定的位置有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
习题 8
找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点
#include<stdio.h>
#define M 3
#define N 4void main()
{int max, min, rowindex, colindex, flag = 0;int array[M][N];printf("请输入%d行%d列的数组:\n", M, N);int i,j; for ( i = 0; i < M; i++){for ( j = 0; j < N; j++)scanf("%d", &array[i][j]);}for ( i = 0; i < M; i++){// 找到这一行最大的元素 max = array[i][0];colindex = 0;for(j=1;j<N;j++){if(array[i][j]>max){int tmp = max;max = array[i][j];array[i][j] = tmp;colindex = j;} }// 判断 在该列是不是最小的 rowindex = 0;min = array[0][colindex];for(j = 1;j<M;j++){if( array[j][colindex]<min){int tmp = min;min = array[j][colindex];array[j][colindex] = tmp;rowindex = j;}}// 如果最小元素与最小元素相同,并且最小元素也在第i行,则为鞍点if (max == min && i == rowindex){flag = 1;printf("鞍点为:%d行%d列的元素%d", rowindex, colindex, max);break;}}if (0 == flag)printf("没有鞍点");}
习题 9
- 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出"无此数"。
二分查找是一个非常高效简单的查找算法,笔试和面试中非常喜欢考察。
折半查找又叫二分查找,查找的前提是序列中元素必须有序,假设区间使用[left, right)标记,待查找元素为key,具体查找的方式如下:当区间[left, right)有效时循环进行一下操作
找到[left, right)区间中间位置
如果key等于中间位置元素,则找到,返回该元素在数组中的下标
如果key小于中间位置元素,到数组的左半侧继续二分查找
如果key大于中间位置元素,到数组的右半侧继续二分查找
如果循环结束时还没有找到,则不存在该元素。
#include<stdio.h>
void main()
{int arr[15] = {99,88,77,66,54,32,21,17,15,14,13,12,9,5,1};int num;int right = sizeof(arr) / sizeof(arr[0]);int left = 0;scanf("%d",&num);int mid = (int)((right+left)/2);if(num == arr[mid])printf("存在\n");while(left<right){mid = (int)((right+left)/2);if(num > arr[mid])right = mid;if(num < arr[mid])left = mid+1;if(num == arr[mid]){printf("存在,在第%d位\n",mid+1);break;}}if (left >= right)printf("无此数\n"); printf("left = %d,right = %d\n",left,right);main();
}
习题 10
有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
#include<stdio.h>
int main()
{char text[3][80];int i,j;int up=0,low=0,dig=0,spa=0,oth=0;for(i=0;i<3;i++){printf("请输入第%d行\n",i+1); gets(text[i]); for(j=0;j<80&&text[i][j]!='\0';j++) { if(text[i][j]>='A'&&text[i][j]<='Z'){up++;}else if(text[i][j]>='a'&&text[i][j]<='z'){low++;}else if(text[i][j]>='0'&&text[i][j]<='9'){dig++;}else if(text[i][j]==' '){spa++;}else{oth++;}}}printf("\n");printf("大写字母:%d个\n",up);printf("小写字母:%d个\n",low);printf("数字 :%d个\n",dig); printf("空格 :%d个\n",spa);printf("其他字符:%d个 \n",oth);return 0;
}
习 题 11
#include<stdio.h>
int main()
{char a[5]= {'*','*','*','*','*'} ;int i,j,k;char space= ' ';for(i=0;i<5;i++){for(j=0;j<=i;j++){printf("%c",space);}printf("%s",a); printf("\n"); }return 0;
}
习题 12
有一行电文,以按下面规律译成密码
A--->Z a--->z
B--->Y b--->Y
C--->X c--->x
……
即第1个字母编程第26个字母,第i个字母编程第(26-i+1)个字母,非字母字符不变,要求编程序将密码译回原文,并输出密码和原文。
假设如果当前拿到的是小写字母,转换方式如下:
先用s[i] - 'a’计算出s[i]是26个字母中从前往后数的第几个
再用26 - (s[i]- ‘a’) - 1 转换为26个字母中从后往前数的第几个
在2的结果上加上’a’,即转换为对应从后往前的第几个字母
大写字母转换方式与上述相同,将上述每条中的’a’换为‘A’即可。
#include<stdio.h>
int main()
{ char s[100];int i,index=0,temp;gets(s);while(s[index++]!='\0');for(i=0;i<index-1;i++){//小写if(s[i]>='a'&&s[i]<='z'){s[i] = 2*'a' + 26-s[i] -1; } // 大写//小写if(s[i]>='A'&&s[i]<='Z'){s[i] = 2*'A' + 26-s[i] -1; } }printf("%s",s);return 0;
}
习题 13
编一程序,将两个字符串连接起来,不要用strcat函数
直接将s2中的字符逐个拷贝到s1的末尾即可,用户需要保证s1中能存的下s2中的字符
获取s1末尾的位置
将s2中的字符逐个拷贝到s1中
#include<stdio.h>
int main()
{char s1[100],s2[100];int i=0,j=0;printf("请输入字符串s1:");gets(s1);printf("请输入字符串s2:");gets(s2);// 把i指向s1的末尾while(s1[i]!='\0'){i++;} // 将s2中的字符逐个往s1之后拼接// 直到s2[j] = '\0' while(s1[i++] = s2[j++]);s1[i] = '\0';printf("将s2拼接在s1之后: ");puts(s1);return 0;
}
习题 14
编写一个程序,将连个字符串s1和s2比较,如果s1 > s2,输出一个整数;若s1 = s2,输出0;若s1 < s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,“A"和“C”相比,由于"A” < “C”,应输出负数,同时由于‘A’与‘C’的ASCII码差值为2,因此应输出"-2"。同理:“And”和"Aid"相比较,根据第2个字符比较结果,“n"比"i"大5,因此应输出"5”。
字符串比较规则:从前往后逐个字符进行比较,相等时继续往后,不相等时返回该位置两个字符差值。
#include<stdio.h>
int main()
{ char s1[100],s2[100];printf("输入s1");gets(s1);printf("输入s2");gets(s2) ;// 求长度int index=0,ret=0;// 将s1和s2中的字符从前往后逐个进行比较,相等继续往后,// 不相等时ret中结果不为0,!ret则为0 循环结束// 如果一个走到末尾,一个未走到末尾 ret也不为0, !ret为0,循环结束// 如果两个字符串相等,同时达到末尾,循环结束while(!(ret=s1[index]-s2[index]) && s1[index]!='\0' && s2[index]!='\0') index++;printf("ret = %d",ret);return 0;
}
习题 15
编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中,不用strcpy函数。复制时,‘\0’也要赋值过去。’\0’之后的字符不复制。
首先必须保证s1能否放的下s2中的字符,然后将s2中的每个字符逐个搬移到s1中即可
s2[index2]位置字符拷贝到s1[index]位置,
然后以s1[index1]的值作为循环条件判断是否拷贝到s2的末尾
#include<stdio.h>
int main()
{char s1[100],s2[50];int i= 0, j = 0;printf("请输入字符串s2:");gets(s2);printf("将s2拷贝到s1后,s1为: ");while (s1[i++] = s2[j++]);puts(s1); return 0;
}
补充
gets()
gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加’\0’字符。其调用格式为:
gets(s);
其中s为字符串变量(字符串数组名或字符串指针)。
也就是说:gets()函数读取到\n(我们输入的回车)于是停止读取,但是它不会把\n包含到字符串里面去。然而,和它配合使用的puts函数,却在输出字符串的时候自动换行。
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
scanf("%s",s)
使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
未定义问题
#include<stdio.h>
int main()
{int a[10] = {1};int b[10];int c[] = {1,2};char d[10] = {'c'};char e[10];char f[] = {'c','e'};printf("%dtest\n",a[9]) ;printf("%dtest\n",a[1]) ;printf("%dtest\n",b[9]) ;printf("%dtest\n",b[5]) ;printf("%dtest\n",c[9]) ;printf("%ctest\n",d[9]) ;printf("%ctest\n",d[11110]) ;printf("%ctest\n",e[9]) ;printf("%ctest\n",f[9]) ;return 0;
}
结果:
int 型
全局数组,未初始化时,默认值都是 0;
局部数组,未初始化时,默认值为随机的不确定的值;
局部数组,初始化一部分时,未初始化的部分默认值为 0;
char 型数组
全局数组,未初始化的部分,默认值为 ‘ ’ 空格;
局部数组,初始化一部分后,未初始化部分默认值为 ‘ ’ 空格;
局部数组,未初始化时,默认值不可预知。
double ,float 型数组
全局数组,未初始化时,默认值都是 0.0;
局部数组,未初始化时,默认值为随机的不确定的值;
局部数组,初始化一部分时,未初始化的部分默认值为 0.0;
bool 型数组
全局数组,未初始化时,默认值都是 0;
局部数组,未初始化时,默认值为 204;
局部数组,初始化一部分时,未初始化的部分默认值为 0;