鱼C论坛

 找回密码
 立即注册
查看: 944|回复: 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步有问题,但我实在改不出来具体哪里有问题了


  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>

  4. char* solve(char **arr, size_t arr_length)
  5. {
  6.     int c;
  7.     char *p;
  8.     char result1[]="23:59";
  9.     char *result=result1;
  10.     int min=0,max_min=0;
  11.     if(arr_length>1)
  12.     {
  13.         for(size_t i=0;i<arr_length-1;i++)
  14.         {
  15.             for(size_t j=0;j<arr_length-i-1;j++)
  16.             {
  17.                 if((c=strcmp(*(arr+j),*(arr+j+1)))>0)
  18.                 {
  19.                   p=*(arr+j);
  20.                   *(arr+j)=*(arr+j+1);      //将传过来的时间按行排序
  21.                   *(arr+j+1)=p;
  22.                 }
  23.             }
  24.         }
  25.         for(size_t m=0,n=0;m<arr_length-1;m++)
  26.         {
  27.              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;
  28.              if(min>max_min)
  29.              {
  30.                 max_min=min;
  31.             
  32.              }
  33.         }
  34.         sprintf(result1, "%02d:%02d", max_min/60,max_min%60);
  35.         return result;
  36.     }
  37.     else
  38.         return result;
  39. }
复制代码
最佳答案
2019-10-17 20:43:01
本帖最后由 superbe 于 2019-10-17 20:50 编辑

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

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>

  4. void solve(char **arr, size_t arr_length, char result[])
  5. {
  6.     int c;
  7.     char *p;
  8.     strcpy(result,"23:59");
  9.     int min=0,max_min=0;
  10.     if(arr_length>1)
  11.     {
  12.         for(size_t i=0;i<arr_length-1;i++)
  13.         {
  14.             for(size_t j=0;j<arr_length-i-1;j++)
  15.             {
  16.                 if((c=strcmp(*(arr+j),*(arr+j+1)))>0)
  17.                 {
  18.                     p=*(arr+j);
  19.                     *(arr+j)=*(arr+j+1);      //将传过来的时间按行排序
  20.                     *(arr+j+1)=p;
  21.                 }
  22.             }
  23.         }
  24.         for(size_t m=0,n=0;m<arr_length-1;m++)
  25.         {
  26.             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;
  27.             if(min>max_min)
  28.             {
  29.                 max_min=min;
  30.             }
  31.         }
  32.         sprintf(result, "%02d:%02d", max_min/60,max_min%60);
  33.     }
  34. }

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

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

  41.     return 0;
  42. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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的结果。

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>

  4. void solve(char **arr, size_t arr_length, char result[])
  5. {
  6.     int c;
  7.     char *p;
  8.     strcpy(result,"23:59");
  9.     int min=0,max_min=0;
  10.     if(arr_length>1)
  11.     {
  12.         for(size_t i=0;i<arr_length-1;i++)
  13.         {
  14.             for(size_t j=0;j<arr_length-i-1;j++)
  15.             {
  16.                 if((c=strcmp(*(arr+j),*(arr+j+1)))>0)
  17.                 {
  18.                     p=*(arr+j);
  19.                     *(arr+j)=*(arr+j+1);      //将传过来的时间按行排序
  20.                     *(arr+j+1)=p;
  21.                 }
  22.             }
  23.         }
  24.         for(size_t m=0,n=0;m<arr_length-1;m++)
  25.         {
  26.             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;
  27.             if(min>max_min)
  28.             {
  29.                 max_min=min;
  30.             }
  31.         }
  32.         sprintf(result, "%02d:%02d", max_min/60,max_min%60);
  33.     }
  34. }

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

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

  41.     return 0;
  42. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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, 2024-5-19 01:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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