鱼C论坛

 找回密码
 立即注册
查看: 1084|回复: 6

[已解决]有关函数或者指针的问题

[复制链接]
发表于 2019-10-17 16:39:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目的:
        确定警报之间的最大时间间隔。 每个警报会在相应的分钟开始时开始响起,并精确地响一分钟。 数组中的时间不是按时间顺序排列的。
例子:
         [“ 23:00”,“ 04:22”,“ 18:05”,“ 06:24”])==“ 11:40”。 警报不会响起的最大间隔为11小时40分钟。
         [“ 14:51”])=“ 23:59”。 如果警报现在响起,则它将在23小时59分钟后不会响起。
**arr是接收数组
我的思路是:
   1  先按行排序时间,
   2  在依次后面时间(换成分钟)减去前面时间(换成分钟)-1,
   3  max_min保存最大的间隔
   4  通过sprintf(result1, "%02d:%02d", max_min/60,max_min%60);将时间间隔按指定格式写到result指针所指的地方
   5  返回result指针;
我估计是4或者第5步有问题,但我实在改不出来具体哪里有问题了

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char* solve(char **arr, size_t arr_length)
{
    int c;
    char *p;
    char result1[]="23:59";
    char *result=result1;
    int min=0,max_min=0;
    if(arr_length>1)
    {
        for(size_t i=0;i<arr_length-1;i++)
        {
            for(size_t j=0;j<arr_length-i-1;j++)
            {
                if((c=strcmp(*(arr+j),*(arr+j+1)))>0)
                {
                  p=*(arr+j);
                  *(arr+j)=*(arr+j+1);      //将传过来的时间按行排序
                  *(arr+j+1)=p;
                }
            }
        }
        for(size_t m=0,n=0;m<arr_length-1;m++)
        {
             min=((arr[m+1][n]-'0')*10+(arr[m+1][n+1]-'0'))*60  +  (arr[m+1][n+3]-'0')*10+(arr[m+1][n+4]-'0') -( ((arr[m][n]-'0')*10+(arr[m][n+1]-'0'))*60+(arr[m][n+3]-'0')*10+(arr[m][n+4]-'0'))-1;
             if(min>max_min)
             {
                max_min=min;
             
             }
        }
        sprintf(result1, "%02d:%02d", max_min/60,max_min%60);
        return result;
    }
    else 
        return result;
}
最佳答案
2019-10-17 20:43:01
本帖最后由 superbe 于 2019-10-17 20:50 编辑

solve函数中result[]是一个局部变量,虽然返回了它的地址,但是它的内容在函数结束后发生了变化。
在main里,根据返回的result地址不能得到正确内容(变化以前的字符串)。可以使用字符数组接收solve的结果。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void solve(char **arr, size_t arr_length, char result[])
{
    int c;
    char *p;
    strcpy(result,"23:59");
    int min=0,max_min=0;
    if(arr_length>1)
    {
        for(size_t i=0;i<arr_length-1;i++)
        {
            for(size_t j=0;j<arr_length-i-1;j++)
            {
                if((c=strcmp(*(arr+j),*(arr+j+1)))>0)
                {
                    p=*(arr+j);
                    *(arr+j)=*(arr+j+1);      //将传过来的时间按行排序
                    *(arr+j+1)=p;
                }
            }
        }
        for(size_t m=0,n=0;m<arr_length-1;m++)
        {
            min=((arr[m+1][n]-'0')*10+(arr[m+1][n+1]-'0'))*60  +  (arr[m+1][n+3]-'0')*10+(arr[m+1][n+4]-'0') -( ((arr[m][n]-'0')*10+(arr[m][n+1]-'0'))*60+(arr[m][n+3]-'0')*10+(arr[m][n+4]-'0'))-1;
            if(min>max_min)
            {
                max_min=min;
            }
        }
        sprintf(result, "%02d:%02d", max_min/60,max_min%60);
    }
}

int main()
{
    char *arr[] = {"23:00", "04:22", "18:05", "06:24"};
    char result[6];
    solve(&arr[0], sizeof(arr)/sizeof(arr[0]), result); 

    printf("最大时间间隔: %s\n", result);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-17 19:44:28 | 显示全部楼层
估计没人看得懂你的题意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 20:25:54 | 显示全部楼层
ba21 发表于 2019-10-17 19:44
估计没人看得懂你的题意

哈哈,就是从主函数那边接收一个时间的二维数组,无序的,需要要先排序,依次每个时间一到,就会响铃一分钟,然后停止,函数返回响铃最大的间隔差,比如第一个例子:先04:22响铃,在06:24响铃,中间间隔02:01,在18:05响铃,中间间隔11:40,依次类推,这里返回间隔最大的 11:40 这个字符串。然后我这里前面排序我试过了,没问题,应该就是返回最大间隔哪里有问题。不知道这下说明白没
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 20:43:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 superbe 于 2019-10-17 20:50 编辑

solve函数中result[]是一个局部变量,虽然返回了它的地址,但是它的内容在函数结束后发生了变化。
在main里,根据返回的result地址不能得到正确内容(变化以前的字符串)。可以使用字符数组接收solve的结果。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void solve(char **arr, size_t arr_length, char result[])
{
    int c;
    char *p;
    strcpy(result,"23:59");
    int min=0,max_min=0;
    if(arr_length>1)
    {
        for(size_t i=0;i<arr_length-1;i++)
        {
            for(size_t j=0;j<arr_length-i-1;j++)
            {
                if((c=strcmp(*(arr+j),*(arr+j+1)))>0)
                {
                    p=*(arr+j);
                    *(arr+j)=*(arr+j+1);      //将传过来的时间按行排序
                    *(arr+j+1)=p;
                }
            }
        }
        for(size_t m=0,n=0;m<arr_length-1;m++)
        {
            min=((arr[m+1][n]-'0')*10+(arr[m+1][n+1]-'0'))*60  +  (arr[m+1][n+3]-'0')*10+(arr[m+1][n+4]-'0') -( ((arr[m][n]-'0')*10+(arr[m][n+1]-'0'))*60+(arr[m][n+3]-'0')*10+(arr[m][n+4]-'0'))-1;
            if(min>max_min)
            {
                max_min=min;
            }
        }
        sprintf(result, "%02d:%02d", max_min/60,max_min%60);
    }
}

int main()
{
    char *arr[] = {"23:00", "04:22", "18:05", "06:24"};
    char result[6];
    solve(&arr[0], sizeof(arr)/sizeof(arr[0]), result); 

    printf("最大时间间隔: %s\n", result);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 22:34:33 | 显示全部楼层
superbe 发表于 2019-10-17 20:43
solve函数中result[]是一个局部变量,虽然返回了它的地址,但是它的内容在函数结束后发生了变化。
在main ...

原来如此,
那我可以把它定义成全局变量也可以,对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 22:42:17 | 显示全部楼层
可以的。char result1[]="23:59"; 变成全局变量。solve也不用return了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-18 10:24:01 | 显示全部楼层
superbe 发表于 2019-10-17 22:42
可以的。char result1[]="23:59"; 变成全局变量。solve也不用return了。

我明白了,感谢大佬的解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表