C语言 谭浩强 题目 -第六章

article/2025/8/20 7:31:39

文章目录

  • 笔记
    • 字符数组
    • 字符数组输出
    • 字符串处理函数
      • 输入字符串的函数 gets()
      • 字符串连接函数--strcat
      • 字符串赋值函数--strcpy
      • 字符串比较函数---strcmp
      • 测字符串长度的函数--strlen
        • 转换为大小写的函数
    • EG 1
    • EG 2
    • EG 3 排序
      • 冒泡排序
    • 不用函数
    • EG 4
    • EG 5
    • EG 6
    • EG 7
    • EG 8
    • EG 9
    • 习题 1
    • 习题 2 选择排序
    • 习题 3
    • 习题 4 插入排序
    • 习题 5
    • 习题 6
    • 习题 7
    • 习题 8
    • 习题 9
    • 习题 10
    • 习 题 11
    • 习题 12
    • 习题 13
    • 习题 14
    • 习题 15
    • 补充
        • gets()
        • scanf("%s",s)
    • 未定义问题

笔记

字符数组

如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。

如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。

如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即′\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

  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插到第31       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

  1. 输出一下的杨慧三角(要求输出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;
}

结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/50b001cffb5944589d74e078a757c115
int 型
全局数组,未初始化时,默认值都是 0;
局部数组,未初始化时,默认值为随机的不确定的值;
局部数组,初始化一部分时,未初始化的部分默认值为 0;

char 型数组
全局数组,未初始化的部分,默认值为 ‘ ’ 空格;
局部数组,初始化一部分后,未初始化部分默认值为 ‘ ’ 空格;
局部数组,未初始化时,默认值不可预知。

double ,float 型数组
全局数组,未初始化时,默认值都是 0.0;
局部数组,未初始化时,默认值为随机的不确定的值;
局部数组,初始化一部分时,未初始化的部分默认值为 0.0;

bool 型数组
全局数组,未初始化时,默认值都是 0;
局部数组,未初始化时,默认值为 204;
局部数组,初始化一部分时,未初始化的部分默认值为 0;


http://chatgpt.dhexx.cn/article/ooKLxFQT.shtml

相关文章

C语言 谭浩强 题目 -第八章

文章目录 笔记通过指针引用数组用数组名作函数参数以变量名和数组名作为函数参数的比较 例题【例8.2】【例8.6】【例8.3】【例 8.4】【例 8.5】【例 8.6】【例8.7】【例8.8】【例8.9】【例 8.10】选择法起泡法 【例 8.11】【例 8.12】【例 8.13】【例8.30】 用指向数组的指针作…

C语言 谭浩强 题目 -第七章

文章目录 笔记函数参数函数调用返回值函数的嵌套函数的递归数组作为函数参数多维数组名作函数参数局部变量和全局变量全局变量 变量的存储方式和生存期自动变量(auto变量)static静态局部变量寄存器变量(register变量) 全局变量在一个文件内扩展外部变量的作用域将外部变量的作用…

【C语言】谭浩强

1.分支选择结构 #include<stdio.h> int main(){ char grade; scanf(“%c”,&grade); printf(“Your score:”); switch(grade) { case’A’:printf(“85~100\n”);break; case’B’:printf(“70~84\n”);break; case’C’:printf(“60~69\n”);break; case’D’:prin…

C语言 谭浩强第五版 课后习题解答

第一章 1.什么是程序?什么是程序设计? 程序&#xff1a;就是一组能识别和执行的指令&#xff0c;每一条指令使计算机执行特定的操作 程序设计&#xff1a;是指从确定任务到得到结果、写出文档的全过程 2.为什么需要计算机语言?高级语言有哪些特点? 为什么需要计算机语言&am…

谭浩强c语言课后习题(更新中)

1.第三章 纯代公式题 #include<stdio.h>int main() {float p1.07; //第一年倍数for (int i 1; i < 10; i) //只用循环了9次&#xff0c;因为是从第一年开始{p p * 1.07;}printf("%f%%%",p*100); }第2题也是代进公式即可 其实也是代给出的公式&#xff0…

C语言学习笔记(C程序设计-谭浩强)

入门&#xff1a; 计算机程序&#xff1a; 一组计算机能够识别和执行的指令。计算机的每一个操作都是根据指令进行的&#xff0c;计算机的一切操作都是由程序控制的 计算机指令&#xff1a;指挥机器工作的指示和命令。 指令包含操作码和操作数&#xff0c;操作码决定要完成的…

清风数学建模笔记--熵权法

是一种可以客观赋权的方法&#xff08;我们可以从数据中查看权重&#xff09; 依据的原理&#xff1a;指标的变异程度越小&#xff0c;所反映的信息量也越少&#xff0c;其对应的权值也应该越低。 本文借鉴了数学建模清风老师的课件与视频&#xff0c;如果大家发现文章中有不正…

c语言计算文本信息熵,C语言求信息熵,条件熵,联合熵

C语言求信息熵,条件熵,联合熵 (3页) 本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01; 11.90 积分 #include#include#define u 20int i,j,n,m;float H_X,H_Y,H_XY,H_XpY,Pypx[u][u],Px[u],H_YpX,Py[u],…

谭浩强C语言笔记

文章目录 谭浩强C语言笔记1.C语言基础知识1.常量和变量1.1入门程序1.2 常量1.2.1 整型常量1.2.2 实型&#xff08;浮点型&#xff09;常量1.2.3 字符常量1.2.4 字符串常量1.2.5 符号常量 1.3 变量1.4 常变量 2.标识符和关键字2.1 标识符2.2 关键字2.3 小习题 3. 基本数据类型3.…

天池比赛总结1

这次参加天池的一场比赛 先把数据读取了如下 接下来准备使用YOLO框出图片中的字符&#xff0c;然后进行识别

比赛总结+近期总结

比赛总结&#xff1a; 这次比赛没考好 20(没加高精度)0&#xff08;文件输出写错&#xff09;1000120 T1&#xff1a;这一题的方法是分解质因数高精度 T2&#xff1a;明显就是一道spfa的题嘛 T3&#xff1a;强大的四维DP&#xff08;我的神啊&#xff01;&#xff09; T4&#…

计算机课件比赛总结,课件制作比赛活动总结

【www.gz85.com - 投篮比赛活动工作总结】 课件制作比赛&#xff0c;是对计算机多媒体等辅助手段的一次检阅&#xff0c;也有力地促进了制作多媒体课件技艺的提高。下面是小编为您整理的“课件制作比赛活动总结”&#xff0c;仅供参考&#xff0c;希望您喜欢&#xff01;更多详…

2018年全国邀请赛(江苏) 比赛总结

先吐槽一下中矿大。。。周六在食堂吃的午饭&#xff0c;肉菜一个鱼一个辣土豆炒牛肉&#xff0c;对于对鱼过敏又感冒比较严重的我来说。。。&#xff08;然后再也没去食堂吃饭&#xff09; 南湖校区大是真大&#xff0c;风景也不错&#xff0c;就是门口离体育馆有点远。。。&a…

比赛总结

比赛总结 比赛总结-a5165.png 初赛终于结束了&#xff0c;头一次如此投入去打比赛&#xff0c;这一个多月以来真是痛并快乐着。最大的感悟是&#xff1a;构造线下验证集并没有什么用&#xff0c;做了一堆工作还不如一个leak。首先取得这个成绩算是给自己一个交代了&#xff0c;…

关于全国大学生软件测试大赛总结与反思

关于全国大学生软件测试大赛总结与反思 文章目录 一、软件测试大赛简介二、可能出现的错误三、个人总结与反思四、谈谈软件测试工程师1、测试的三个阶段2、就业优势3、就业要求4、参考薪资 一、软件测试大赛简介 由教育部软件工程专业教学指导委员会、全国高等院校计算机基础教…

【赛后总结】第十三届服务外包创新创业大赛总结——A14

目录 前言组队&#xff06;选题分工&项目推进提交材料&项目答辩区域赛初赛区域赛决赛全国总决赛 写在最后 前言 先摆两个参赛视频 初赛视频 决赛视频 比赛已经过去几个月了&#xff0c;也算是想起来这个比赛可以写一个总结了。在历时8个月左右的时间之后&#xff0c;我…

计算机大赛总结发言稿,学校技能比赛总结发言稿

学校技能比赛总结发言稿 总结就是把一个时间段取得的成绩、存在的问题及得到的经验和教训进行一次全面系统的总结的书面材料&#xff0c;写总结有利于我们学习和工作能力的提高&#xff0c;因此十分有必须要写一份总结哦。那么总结要注意有什么内容呢&#xff1f;以下是小编帮大…

计算机知识与技能比赛活动总结,中职技能大赛总结(精选6篇)

中职技能大赛总结(精选6篇) 总结是对取得的成绩、存在的问题及得到的经验和教训等方面情况进行评价与描述的一种书面材料&#xff0c;它能够使头脑更加清醒&#xff0c;目标更加明确&#xff0c;因此我们需要回头归纳&#xff0c;写一份总结了。那么你知道总结如何写吗&#xf…

稳定的iOS迅雷来了 不用再每次想用都要重装

迅雷iOS下载:www.xunlei-iosd.top 用过苹果产品的朋友都知道&#xff0c;在iOS系统里&#xff0c;迅雷这一APP是不存在的。当有朋友分享了某些资源给你&#xff0c;只能想办法使用复杂的操作安装一个寿命只有几天的迅雷APP。 今天&#xff0c;官方推出了“永久版”iOS迅雷&…

iOS - Threads 多线程

1、Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的&#xff0c;每个进程均运行在其专用且受保护的内存空间内。 比如同时打开 QQ、Xcode&#xff0c;系统就会分别启动两个进程。通过 “活动监视器” 可以查看 Mac 系统中所开启的进程。 一个程…