C:指针+动态内存 错题(反思在最后)

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数组的首地址。
感觉自己像个大傻瓜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值