*浙大MOOC翁恺C语言程序设计课后习题解答记录
题目来源:https://blog.csdn.net/fjinhao/article/details/46853171
##week 02
##2.0
#include <stdio.h>
int main()
{
int a,b;
printf("请输入两个正整数:");
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a+b);
printf("%d - %d = %d\n", a, b, a-b);
printf("%d * %d = %d\n", a, b, a*b);
printf("%d / %d = %d\n", a, b, a/b);
return 0;
}
***##2.1***厘米换算英尺英寸
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
double b = a/100.0/0.3048*12;
int c = (int)b;
printf("%d %d", c/12, c%12);
return 0;
}
更简略的程序(重新定义double变量为int时,会自动抛弃小数点及后面部分,无四舍五入)
#include <stdio.h>
int main()
{
int cm;
scanf("%d", &cm);
double t = cm/100.0/0.3048;
int foot = t;
int inch = (t - foot)*12;
printf("%d %d\n", foot, inch);
return 0;
}
##2.2******然后是几点
#include <stdio.h>
int main()
{
//首先将给定的时间间隔分离出小时与分钟,
int oldtime;
int t;
scanf("%d %d", &oldtime, &t);
int hour = t/60;
int min = t%60;
// 然后将其时间间隔转化成四位数表示的形式,与原来时间相加得到新时间
int pass =hour * 100 + min;
int newtime = oldtime + pass;
//由于可能出现分钟位超过六十的情况,因此将新时间的分钟,小时分离,对60整除,并对小时进位(or not),分钟减去进位(or not),再转化成四位数表示的形式
min = newtime%100;
hour = newtime/100;
int s = min/60;
hour += s;
min -= s*60;
newtime = hour*100 + min;
printf("%d", newtime);
return 0;
}
***scanf里忘记了加&***,调试了很久(哭o(╥﹏╥)o
另一种别人写的,和我的思路正好相反
`#include <stdio.h>
int main()
{
int i, j, x = 0, y, z;
scanf("%d%d", &i, &j);
if(i >= 1000)
{
x = i / 1000;
y = (i % 1000) / 100;
z = (i %1000) %100;
}
else
{
y = i / 100;
z = i % 100;
}
int s = (10*x + y) * 60 + z;
int n = s + j;
i = n / 60 *100 + (n - ((n / 60 )* 60));
printf("%d", i);
return 0;
}`
时间:2019/3/9
##2.3******逆序的三位数
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
//将该三位数通过%和/的方式拆成三个数
int b,c,d;
b = a/100;
int m = a%100;
c = m/10;
d = m%10;
//组合成一个新的数
int newnum = d*100 + c*10 + b;
printf("%d", newnum);
return 0;
}
##2.4******BCD解密
由于不了解二进制,十进制,十六进制在电脑上的关系,因此题干难以理解!!!
老师给出的解答
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
printf("%x", a);
return 0;
}
当直接使用"%x"会直接将十进制的数以16进制形式输出,但是不会有16进制前面的那两个字符!
或者这样做:
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
int b = a/16*10 + a%16;
printf("%d", b);
return 0;
}
直接把十进制的数通过数学计算的形式转化成十六进制。
##3.0******超速判断
#include <stdio.h>
int main()
{
int speed;
scanf("%d", &speed);
//判断是否超速并输出
if (speed > 60){
printf("Speed: %d - Speeding", speed);
}else{
printf("Speed: %d - OK", speed);
}
return 0;
}
##3.1******三天打鱼两天晒网
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
//除去5之后,得到剩下的余数
int t = n%5;
//判断与3的大小关系
if (t>=1 && t<=3){
printf("Fishing in day %d\n", n);
} else{
printf("Drying in day %d\n", n);
}
return 0;
}
##3.2*** 用天平找小球***
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d %d %d", &a, &b, &c);
//只需比较是否相等,不用管大小关系,比较两次即可得出结论
if (a == b){
printf("C");
}else{
if (a == c){
printf("B");
} else{
printf("A");
}
}
return 0;
}
##3.3*** 12-24小时制***
#include <stdio.h>
int main()
{
int hour, minute;
scanf("%d:%d", &hour, &minute);
//只需比较hour和12及0的关系,在这个基础上考虑减或不减12
if (hour>=0 && hour<12){
printf("%d:%d AM", hour, minute);
} else if (hour == 12){
printf("%d:%d PM", hour, minute);
}else{
printf("%d:%d PM", hour-12, minute);
}
return 0;
}
##3.4*** 成绩转换***
#include <stdio.h>
int main()
{
int score;
scanf("%d",&score);
score /= 10;
switch (score){
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
}
return 0;
}
##4.0*** 求符合给定条件的整数集***
整了很久,原因是没弄清楚各层的关系,弄错了大括号!
#include <stdio.h>
int main()
{
int a,b,c,s;
scanf("%d",&a);
b = a;
c = a;
s = a;
int t = a+3;
//三层嵌套,第二层和第三层需要if来使得a,b,c不等,注意在每个循环的末尾加上改变条件的表达式!
//输出时只需在a变化后加空行即可,
while(a<=t){
while(b<=t){
if (b!=a){
while (c<=t){
if (c!=a && c!=b){
printf("%d ", a*100+b*10+c);
}
c++;
}
}
b++;
c = s;
}
a++;
b=s;
printf("\n");
}
return 0;
}
##4.1*** 水仙花数***
时间花了很久才写出来!
#include <stdio.h>
int main()
{
//tansfer为传入循环时代替的t的值
//digit是transfer的每位数的值
//u_n为传入循环时代替的N的变量,防止N被改变
//c是求和时每个位的N次方的值,sum即为各位n次方的和
int n,transfer,digit,u_n,c;
//min和max是n位数的区间端点值
int min=1, max =1;
scanf("%d", &n);
//q_n为计算N位数区间的循环时代替的n的值
int q_n=n;
while (q_n>1){
min *= 10;
max *= 10;
q_n--;
}
max = max*10 -1;
transfer = min;
int m;
int sum;
// printf("n=%d",n);
while (transfer<=max){
m=transfer;
sum = 0;
while (m>0){
digit = m%10;
c=1;
//循环求n次方
while(u_n>0){
c *= digit;
u_n--;
}
//求n次方之和
sum += c;
m = m/10;
u_n=n;
}
if (sum == transfer){
printf("%d\n", transfer);
}
transfer++;
}
return 0;
}
时间:2019/3/10
##4.2*** 打印九九口诀表***
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
//trans为循环内部代替n的变量,防止n被改变
//i,t均为循环内部的变量
int trans = n,i=1,t;
while (i<=n){
t=1;
//printf("i=%d, n=%d,t=%d\n",i,n,t);
while(t<=i){
printf("%d*%d=%d ", t,i,t*i);
t++;
}
i++;
//当i+1发生时,换行
printf("\n");
}
return 0;
}
##4.3*** 统计素数并求和***
#include <stdio.h>
int main()
{
int M,N;
scanf("%d %d",&M,&N);
int count=0,sum=0;
int i=2;
int status = 1;//1表示为素数,0表示不是素数
//printf("M=%d,N=%d\n",M,N);
while(M<=N){
do
{
if(M%i == 0){
//printf("该数不是素数!");
status = 0;
break;
}else{
i++;
}
}while (i<M);
if (status == 1){
//printf("%d为素数\n",M);
sum += M;
count++;
}
//printf("M=%d,status = %d\n",M,status);
M++;
i=2;
status = 1;
//printf("changed_M=%d,i=%d\n",M,i);
}
printf("%d %d", count, sum);
return 0;
}
##4.4*** 猜数字游戏***
注释的大部分为调试时加上的,调试的时间比较长是因为又忘记在scanf里面的变量前面加&,o(╥﹏╥)o
下次一定要注意注意注意注意!!!!!
#include <stdio.h>
int main()
{
int number,i;
scanf("%d %d", &number, &i);
int x;//这个数为用户输入的数字
//printf("请输入一个数字:");
scanf("%d",&x);
int count=1;//用于和i比较
if (x<0){
printf("Game Over!");
}else{
while(x>0){
if (x>number){
printf("Too big\n");
}else if(x<number){
printf("Too small\n");
}else{
if (count ==1){
printf("Bingo!\n");
}else if(count <= 3){
printf("Lucky You!\n");
}else{
printf("Good Guess!\n");
}
//printf("I am here before the loop.\n");
while(x>0){
//printf("Am I in this loop?\n");
scanf("%d",&x);
//printf("x=%d\n",x);
if (x<0){
//printf("I want to out of the loop.\n");
return 0;
}else{
//printf("I am in this loop!\n");
}
//printf("I am leaving?!\n");
}
//printf("I am out!");
}
count++;
if (count>i){
printf("Game Over!\n");
break;
}
scanf("%d",&x);
}
}
return 0;
}
时间:2019/3/11
##5.0*** 求序列前N项和***
在写的时候不小心看错了题目,导致浪费了太多时间!!!
#include <stdio.h>
int main()
{
int N;
//scanf("%d", &N);
N = 20;
int i;
double sum=0.0;
double s, t=2.0,m=1.0,c;
//printf("original:t=%f,sum=%f\n",t,sum);
for(i=1;i<=N;i++){
s = t / m;
c=t;
t += m;
m=c;
sum += s;
//printf("s=%f,t=%f,sum=%f\n",s, t, sum);
}
printf("%.2f", sum);
return 0;
}
##5.1*** 约分最简分式***
#include <stdio.h>
//辗转相除法确定最大公约数
int main()
{
int a,b;
scanf("%d/%d", &a, &b);
//a = 4; b=6;
int c = a, d = b;//代替a,b进入循环,防止a,b的值被改变
int t;
while(d != 0){
t = c%d;
c = d;
d = t;
}
//printf("%d/%d=%d/%d\n", a,b,a/c,b/c);
printf("%d/%d", a/c, b/c);
return 0;
}
##5.2*** 念数字***
#include <stdio.h>
int main()
{
int number;
//scanf("%d",&number);
number = -600;
if (number < 0){
printf("fu ");
number *= -1;
}
//得到number的(位数-1)*10
int t = number,mask = 1;
do{
t /= 10;
mask *= 10;
}while (t>9);
t = number;
//printf("mask=%d,t=%d\n",mask,t);
int i;
do{
i = t/mask;
//printf("i= %d\n",i);
switch (i){
case 0:
printf("ling");
break;
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
}
if (mask >0){
printf(" ");
}
t %= mask;
//printf("\nt = %d\n",t);
mask /= 10;
}while (mask>0);
return 0;
}
##5.3*** 求a的连续和***
#include <stdio.h>
int main()
{
int a,n,i;
scanf("%d %d", &a, &n);
int mul=0, sum = 0;
for( i=1 ; i<=n ; i++){
//printf("I am in the loop.\n");
mul = mul * 10 + a;
//printf("mul=%d", mul);
sum += mul;
//printf(" sum=%d\n",sum);
}
printf("%d", sum);
return 0;
}
##6.0 混合类型数据格式化输入
#include <stdio.h>
/*
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
*/
int main()
{
int a;
double b,c;
char d;
scanf("%lf %d %c %lf", &b, &a, &d, &c);
printf("%c %d %.2f %.2f", d, a, b, c);
return 0;
}
##6.1简单计算器
没有思路,完全不知道怎么读入一个运算表达式!如果用char作为输入的话,发现太长会报warning,超过char的表达范围。
&忽略了题目的条件“四种运算符优先级相同”!
来自:https://blog.csdn.net/huozhiwu0424/article/details/37671693
c语言输入,每次scanf的读取数目与该语句内部的变量多少有关,如果小于输入的数目,则剩下的输入会被舍弃,但如果另写一句scanf,则可以继续读取第一个scanf读取完后的输入!
#include <stdio.h>
int main()
{
int a,b;
char c;
scanf("%d", &a);
while(scanf("%c", &c)){
switch (c){
case '+': {scanf("%d", &b); a+=b; break;}
case '-': {scanf("%d", &b); a-=b; break;}
case '*': {scanf("%d", &b); a*=b; break;}
case '/': {scanf("%d", &b);
if(b == 0){
printf("ERROR\n");
return 0;
}else{
a/=b; break;
}
}
case '=': {printf("%d\n",a); return 0;}
default:{
printf("ERROR\n"); return 0;
}
}
}
return 0;
}
##6.2字符串字母大小写转换
了解了上一道题如何输入,这一道题会变得非常简单。
#include <stdio.h>
/*
输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。
*/
int main()
{
char a;
while(scanf("%c",&a)){
if (a>= 'A'&& a<= 'Z'){
a += 'a'-'A';
printf("%c", a);
}else if(a>='a' && a<= 'z'){
a += 'A'-'a';
printf("%c", a);
}else if(a == '#'){
break;
}else{
printf("%c",a);
}
}
return 0;
}
##6.3 单词长度
注意1.连续出现两个空格时,不能打印出count=0,必须跳过,读取下一个字符;
2.最后一个单词结尾必然没有空格,因此最后一个单词的字符数打印应该在break语句的前面;
3.空格问题,只需在打印最后一个单词时不加空格即可。
#include <stdio.h>
int main()
{
char a;
int count=0,i=0;
while(scanf("%c", &a)){
if (a != '.'){
if (a != ' '){
count ++;
}else if(a == ' '){
if (count != 0){
printf("%d ",count);
count =0;
}
}
}else{
printf("%d",count);
break;
}
}
return 0;
##7.0 写出这个数
注意int表示的整数范围只在十位数,因此本题需用第六周习题里面的char类型读入,再根据ASCII将字符数字转化成整数。
念出这个数可根据前面的习题,创建一个函数,调用即可。
#include <stdio.h>
void readnumber(int number);//函数原型
int main()
{
char n;
//scanf("%d", &n);
//n=1234567890987654321123456789;
int i;
int sum =0;
while(1){
scanf("%c", &n);
if (n == '\n'){
break;
}
i = (int)n -48;
sum += i;
}
//printf("%d\n",sum);
readnumber(sum);
return 0;
}
void readnumber(int number){
//int number;
//scanf("%d",&number);
//number = -3;
if (number < 0){
printf("fu ");
number *= -1;
}
//得到number的(位数-1)*10
int t = number,mask = 1;
do{
t /= 10;
mask *= 10;
}while (t>9);
t = number;
//printf("mask=%d,t=%d\n",mask,t);
int i,count=0;
do{
i = t/mask;
if (i!=0 || count !=0){
//printf("i= %d\n",i);
switch (i){
case 0:
printf("ling");
break;
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
}
if (mask >0){
printf(" ");
}
}
t %= mask;
//printf("\nt = %d\n",t);
mask /= 10;
count++;
}while (mask>0);
}
##7.1换个格式输出整数
让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。
输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。
输出格式:每个测试用例的输出占一行,用规定的格式输出n。
输入样例1:
234
输出样例1:
BBSSS1234
输入样例2:
23
输出样例2:
SS123
##7.1和7.2忘记保存了o(╥﹏╥)o
##7.3数素数
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
#include <stdio.h>
int main()
{
int pm,pn;
scanf("%d %d", &pm, &pn);
int i,n=3;
int status=1,count =1,j=0;
while(count<pn){
for(i=2;i<n;i++){
if (n%i ==0){
status =0;
//printf("n=%d不是素数,status=%d\n",n,status);
break;
}
}
if(status ==1){
count ++;
//printf("n=%d是素数,count =%d\n",n,count);
if (count>=pm){
printf("%d",n);
j++;
}
if (j<10 && j>0){
printf(" ");
}else{
printf("\n");
j = 0;
}
}
n++;
status =1;
}
return 0;
}
##8.0查找整数
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式:
输入在第1行中给出2个正整数N(<=20)和X,第2行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found
#include <stdio.h>
int main()
{
int n,x;
scanf("%d %d",&n, &x);//n为一维数组的大小
int number[n];
int i,t,status=0;
for (i=0;i<n;i++){
scanf("%d",&t);
number[i]=t;
}
for(i=0;i<n;i++){
if(number[i] == x){
printf("%d",i);
status=1;
break;
}
}
if(status==0){
printf("Not Found");
}
return 0;
}
##8.1 求一批整数中出现最多的个位数字
#include <stdio.h>
int main()
{
int n=10;//共十个数字,0~9
int s;
scanf("%d",&s);//s为给出的整数的个数
int number[3],a[n];
//对a[n]初始化
int i,j;
int temp,t;
for(i=0;i<n;i++){
a[i] = 0;
}
//读入数组
for (i=0;i<s;i++){
scanf("%d",&number[i]);
}
//得到10个数字出现频率的次数,组成一个数组,如a[3]=1,表示数字3出现的次数为1
for (i=0;i<s;i++){
while(number[i]>0){
t = number[i]%10;
a[t]++;
number[i] /= 10;
}
}
int b[n];
for (i=0;i<n;i++){
b[i] = a[i];
}
//冒泡排序
for (j = 0; j < n-1; j++){
for (i = 0; i < n - 1 - j; i++){
if(b[i] > b[i + 1]){
temp = b[i];
b[i] = b[i + 1];
b[i + 1] = temp;
}
}
}
printf("%d: ",b[n-1]);
for (i=0;i<n;i++){
if(a[i] == b[n-1]){
printf("%d ",i);
}
}
return 0;
}
最后的空格实在是不知道咋写进去,如果使用类似素数里面的状态参数判断,发现不成功
查看答案后,发现很简单,把空格移到前面就可以o(╥﹏╥)o
printf("%d:",b[n-1]);
for (i=0;i<n;i++){
if(a[i] == b[n-1]){
printf(" %d ",i);
}
}
同时里面也不需要使用冒泡算法,只需要找到最大值就可以了。
int max=0;
for (i=0;i<n;i++) {
if(max < a[i]){
max = a[i];
}
}
printf("%d:",max);
for (i=0;i<n;i++){
if(a[i] == max){
printf(" %d ",i);
}
}
##8.2 求矩阵的局部极大值
#include <stdio.h>
/*
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。
本题要求给定矩阵的全部局部极大值及其所在的位置。
*/
int main()
{
int row,col;
scanf("%d %d", &row, &col);
int matrix[row][col];
int i,j;
for (i=0;i<row;i++){
for(j=0;j<col;j++){
scanf("%d",&matrix[i][j]);
}
}
//
// for (i=0;i<row;i++){
// for(j=0;j<col;j++){
// printf("%d", matrix[i][j]);
// if(j<col-1){
// printf(" ");
// }
// }
// printf("\n");
// }
//
int count = 0;
for (i=1;i<row-1;i++){
for(j=1;j<col-1;j++){
if(matrix[i][j] > matrix[i-1][j] && matrix[i][j] > matrix[i+1][j] &&
matrix[i][j] > matrix[i][j-1] && matrix[i][j] > matrix[i][j+1]){
printf("%d %d %d\n", matrix[i][j], i+1, j+1);
count ++;
}
}
}
if (count == 0){
printf("None %d %d", row,col);
}
return 0;
}
8.3 组个最小数
问题:1.当不确定数组大小时,读入什么条件结束读入
char ch;
while(ch != '\n'){
//进入循环,开始读入数组
}
2.如何将第一步寻找最小的数与之后的步骤写成一个大的循环
看完别人的代码,发现完全理解错了题意,测试用例看错了!!
以下代码来自:https://blog.csdn.net/phenixfate/article/details/42918685
#include<stdio.h>
int main()
{
int array[10];
int i,n;
for(i=0;i<10;i++)
{
scanf("%d",&n);
array[i] = n;
}
for(i=1;i<10;i++) //输出第一个数
{
if(array[i]!=0)
{
printf("%d",i);
array[i] --;
break;
}
}
int j;
for(i=0;i<10;i++)
{
for(j=1;j<=array[i];j++)
printf("%d",i);
}
return 0;
}
##10.0说反话
发现自己不知道读入字符串如何结束读入,o(╥﹏╥)o,感觉自己好笨!
char s[100];
gets(s);
gets(s);//这里的函数是:读入字符串,只有在读到回车时才停止读入,空格正常读入!(所以也会和scanf一样有数组越界的风险)
scanf函数读入为读到空格,回车,tab为止
#include <stdio.h>
#include <string.h>
int main(int argc, const char* argv[])
{
char len[81];
gets(len);
int k = strlen(len);
char* p;
p = len + k;
//printf("%d",k);
while (1) {
if(*p == ' ' && *p+1 != ' ') {
*p = '\0';
printf("%s ", p+1);
}
if ( p == len){
printf("%s", p);
break;
}
p--;
}
return 0;
}
注意:
1.printf("%s",p);//输出的是字符串(以’\0’作为结束的字符串),不是单个的字符,
2.printf("%d",p);//输出的是p指针的十进制地址,当然%p输出的就是16进制的地址
##8.1在字符串中查找指定字符
输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。
输入格式:
输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。
输出格式:
在一行中按照题目要求输出结果。
输入样例1:
It is a black box
b
输出样例1:
black box
输入样例2:
It is a black box
B
输出样例2:
Not found
注意:1.C语言中,输出字符串的函数有两个:
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。
2.C语言中,输入字符串的函数有两个:
scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
注意scanf()读到空格,tab,回车结束,
gets():直接输入字符串,并且只能输入字符串。读到回车结束,读到空格不停止
gets(arrayName);参数是字符数组
#include <stdio.h>
#include <string.h>
int main(int argc, const char* argv[])
{
char len[81];
char c[2];
gets(len);
scanf("%s", c);
//
// printf("len=%s ", len);
// printf("%s\n",c);
//
char *p = strchr(len, c[0]);
if( p != NULL) {
printf("%s\n", p);
} else {
printf("Not found\n");
}
return 0;
}
发现自己指针没学明白,printf("%p",p)输出的是指针p的16进制地址,printf("%s",p)输出的是指针p指向的字符串。
##8.2 删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
**没写出来,发现自己对字符数组,指针这块理解得不够透彻,很多语法都没写对!
#include <stdio.h>
#include <string.h>
int main(int argc, const char* argv[])
{
char s1[81], s2[81];
gets(s1);
gets(s2);
int i;
do{
char *p = strstr(s1,s2);
if (p){
for(i=0;i<strlen(p)-strlen(s2);i++){
p[i] = p[strlen(s2) +i];
}
p[i] = '\0';
}else{
printf("%s",s1);
break;
}
}while(1);
return 0;
3.21//
基本上C语言的学习就到此告一段落了,接下来应该要进行数据结构的学习了。
C语言学习时间:3.10-3.21,十一天有点长,太拖沓了!接下来的数据结构要认真快速地完成。