30,267
社区成员




题目 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.忘了用结构体变量做函数参数,向函数传递结构体完整结构(属于传值调用,不会影响相应的实参结构体的值)
应该用结构体指针或结构体数组作函数参数属于按引用调用,会影响相应的实参结构体的值,向函数传递结构体地址,因为仅复制结构体首地址一个值给被调函数,能够实现改变原结构体。