1.写一个函数将以秒计数的时间转换为以时、分、秒计数的时间。
函数原型为:char *seconds_to(int seconds)。
编写main调用测试它。
**输入格式要求:"%d" 提示信息:“请输入时间(秒):\n”
**输出格式要求:"%d秒合计%s!\n" “%d小时%d分钟%d秒”
提示:此题需要使用sprintf()函数,"%d小时%d分钟%d秒"是sprintf的输出格式。
程序运行示例:
请输入时间(秒):↙
3605
3605秒合计1小时0分钟5秒!↙
#include<stdio.h>
#include<stdlib.h>
char *seconds_to(int seconds);
int main(){
int second;
char t[100];
char *x;
printf("请输入时间(秒):\n");
scanf("%d",&second);
x=seconds_to(second);
sprintf(t,"%d小时%d分钟%d秒",x[0],x[1],x[2]);
printf("%d秒合计%s!\n",second,t);
}
char *seconds_to(int seconds){
char *x1=(char *)calloc(3,sizeof(char));
x1[0]=seconds/3600%24;
x1[1]=seconds/60%60;
x1[2]=seconds%60;
return x1;
}
2.题目:给定一个目标字符串dest和待插入的字符串src,以及插入位置index.编程实现在dest的指定位置index后面插入src,返回插入之后的dest并打印.比如:dest为:hello,c!,src为:love,index为4,则返回dest为:hellloveo,c!.
要求:
1 用返回指针的函数实现。char *insert(char *dest,char *src,int index).
2 输入输出格式:
输入两行:第一行为:dest和src 中间用空格隔开,如:abc def.第二行为:index.
输出一行:为插入之后的字符串。
3 index为不小于0的int,dest,src是最大长度不超过50的字符串.如果index小于0或超过dest长度,均提示输出:“index illegal!”,退出程序。
程序运行示例:
hello world
3
helworldlo
错的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 50
char *insert(char *dest, char *src, int index);
int main()
{
char x[N], y[N];
char *p;
int index;
scanf("%s%s", x, y);
getchar();
scanf("%d", &index);
if (index < 0 || index > strlen(x)){
printf("index illegal!");
}else{
p=insert(x, y, index);
printf("%s",p);
}
return 0;
}
char *insert(char *dest, char *src, int index)
{
int i=0;
char *p=(char *)calloc(2*N,sizeof(char));
for(;*dest!='\0'||*src != '\0';i++){
if(i==index){
for (; *src != '\0'; src++)
{
*p++ = *src;
}
}
*p++=*dest++;
}
*p='\0';
return p;
}
修正:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 50
char *insert(char *dest, char *src, int index);
int main()
{
char x[N], y[N];
char *p;
int index;
scanf("%s%s", x, y);
getchar();
scanf("%d", &index);
if (index < 0 || index > strlen(x)){
printf("index illegal!");
}else{
p=insert(x, y, index);
printf("%s",p);
}
return 0;
}
char *insert(char *dest, char *src, int index)
{
int i=0;
char *t;
char *p=(char *)calloc(2*N,sizeof(char));
t=p;//存放p的首地址
for(;*dest!='\0'||*src != '\0';i++){
if(i==index){
for (; *src != '\0'; src++)
{
*p++ = *src;
}
}
*p++=*dest++;//p的指向已不在p申请的数组的首地址,指向尾端
}
*p='\0';
return t;
}
反思:
对于第一个题目,我并没有改变指针的指向,所以返回x1时,返回的是我申请的那块内存的首地址,相当于数组的首地址。
但是第二个题目,p++是p=p+1,我改变了指针的指向,p在逐渐加一的过程中向后移动,最终指向数组最后一个元素,及’\0’的位置,我返回的并非数组的首地址而是’\0’的地址,所以我应该在最开始存一下p数组的首地址。
感觉自己像个大傻瓜