打卡第十天----1048,1049

题目 1048: 

[编程入门]自定义函数之字符串拷贝

时间限制: 3s 内存限制: 192MB 提交: 18965 解决: 11014

题目描述

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

输入格式

数字n 一行字符串 数字m

输出格式

从m开始的子串

样例输入

复制

6
abcdef
3

样例输出

复制

cdef

错误代码:

#include <stdio.h>
#include <string.h>
#define N 1000
int main()
{
    int n,m;
    char str[N];
    char cp[N];//用来存放新字符串
    int k=0;//计数器
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%c",&str[i]);
    }
        scanf("%d",&m);
            for(int j=m-1;j<n;j++)
            {
                cp[k++]=str[j];
            }
    puts(cp);
    return 0;
}

正确代码:

#include <stdio.h>
#include <string.h>
#define N 1000
int main()
{
	int n,m;
	char str[N];
	char cp[N];//用来存放新字符串
	int k=0;//计数器
	scanf("%d",&n);
	getchar();
/*	scanf()在输入第一个整数后的回车符在缓冲区,这个回车符留在缓冲区就会被读取字符的时候读取了
  所以要么加\n,要么用getchar()吃掉回车符*/
	for(int i=0;i<n;i++)
	{
		scanf("%c",&str[i]);
	}
		scanf("%d",&m);
			for(int j=m-1;j<n;j++)
			{
				cp[k++]=str[j];
			}
	puts(cp);
	return 0;
}

错误原因:

1.忘了字符输入时的坑了,scanf()和getchar()都是从缓冲流中接收数据,其中就包括在键盘输入的空格、回车这类字符,当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均作为有效字符会被%c接收。因此,我第一个输入的整数的回车符留在缓冲流里被后面的字符输入给接收了。

2.gets()从键盘键入以回车结束的字符串放入字符数组中,并自动加’\0’,所以其自动扔掉回车符,不会将其留在字符串内或缓冲区内。

详情:

【精选】C语言字符和字符串的输入与输出_c语言输入字符_yummy、的博客-CSDN博客

题目 1049: 

[编程入门]结构体之时间设计

时间限制: 3s 内存限制: 192MB 提交: 21352 解决: 12397

题目描述

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

输入格式

年月日

输出格式

当年第几天

样例输入

复制

2000 12 31

样例输出

复制

366

错误代码:

#include <stdio.h>
#include <string.h>
#define N 1000
struct Date{
    int year;
    int month;
    int day;
};
void Pd(struct Date date)
{
    switch (date.month) {
    case 1:
        date.day=0;
        break;
    case 2:
        date.day=31;
        break;
    case 3:
        date.day=59;
        break;
    case 4:
        date.day=90;
        break;
    case 5:
        date.day=120;
        break;
    case 6:
        date.day=151;
        break;
    case 7:
        date.day=181;
        break;
    case 8:
        date.day=212;
        break;
    case 9:
        date.day=243;
        break;
    case 10:
        date.day=273;
        break;
    case 11:
        date.day=304;
        break;
    case 12:
        date.day=334;
        break;
        
    }
}
int main()
{
    struct Date date;
    int year,month,day;
    scanf("%d%d%d",&year,&month,&day);
    date.year=year;
    date.month=month;
    date.day=day;
    if(((date.year%4==0)&&(date.year%100!=0))||(date.year%400==0))
    {
        Pd(date);
        date.day=date.day+day;
        date.day++;
    }
    else{
        Pd(date);
        date.day=date.day+day;
    }
    printf("%d",date.day);
    return 0;
}

实现代码:

#include <stdio.h>
#include <string.h>
#define N 1000
struct Date{
	int year;
	int month;
	int day;
};
void Pd(struct Date *date)
/*用结构体指针或结构体数组作函数参数属于按引用调用,
会影响相应的实参结构体的值,向函数传递结构体地址*/
{
	switch (date->month) {
	case 1:
		date->day=0;
		break;
	case 2:
		date->day=31;
		break;
	case 3:
		date->day=59;
		break;
	case 4:
		date->day=90;
		break;
	case 5:
		date->day=120;
		break;
	case 6:
		date->day=151;
		break;
	case 7:
		date->day=181;
		break;
	case 8:
		date->day=212;
		break;
	case 9:
		date->day=243;
		break;
	case 10:
		date->day=273;
		break;
	case 11:
		date->day=304;
		break;
	case 12:
		date->day=334;
		break;
		
	}
}
int main()
{
	struct Date date;
	int year,month,day;
	scanf("%d%d%d",&year,&month,&day);
	date.year=year;
	date.month=month;
	date.day=0;
	if(((date.year%4==0)&&(date.year%100!=0))||(date.year%400==0))//判断闰年
	{
		Pd(&date);//传地址,给到结构体指针
		date.day=date.day+day;
		//先求出月数之前所过的日期,再加上本月的日期
		date.day++;//闰年二月多一天
	}
	else{
		Pd(&date);
		date.day=date.day+day;
	}
	printf("%d",date.day);
	return 0;
}

错误原因:

1.忘了用结构体变量做函数参数,向函数传递结构体完整结构(属于传值调用,不会影响相应的实参结构体的值)

应该用结构体指针结构体数组作函数参数属于按引用调用,会影响相应的实参结构体的值,向函数传递结构体地址,因为仅复制结构体首地址一个值给被调函数,能够实现改变原结构体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值