有关函数或者指针的问题
目的:确定警报之间的最大时间间隔。 每个警报会在相应的分钟开始时开始响起,并精确地响一分钟。 数组中的时间不是按时间顺序排列的。
例子:
[“ 23:00”,“ 04:22”,“ 18:05”,“ 06:24”])==“ 11:40”。 警报不会响起的最大间隔为11小时40分钟。
[“ 14:51”])=“ 23:59”。 如果警报现在响起,则它将在23小时59分钟后不会响起。
**arr是接收数组
我的思路是:
1先按行排序时间,
2在依次后面时间(换成分钟)减去前面时间(换成分钟)-1,
3max_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-'0')*10+(arr-'0'))*60+(arr-'0')*10+(arr-'0') -( ((arr-'0')*10+(arr-'0'))*60+(arr-'0')*10+(arr-'0'))-1;
if(min>max_min)
{
max_min=min;
}
}
sprintf(result1, "%02d:%02d", max_min/60,max_min%60);
return result;
}
else
return result;
} 估计没人看得懂你的题意 ba21 发表于 2019-10-17 19:44
估计没人看得懂你的题意
哈哈,就是从主函数那边接收一个时间的二维数组,无序的,需要要先排序,依次每个时间一到,就会响铃一分钟,然后停止,函数返回响铃最大的间隔差,比如第一个例子:先04:22响铃,在06:24响铃,中间间隔02:01,在18:05响铃,中间间隔11:40,依次类推,这里返回间隔最大的 11:40 这个字符串。然后我这里前面排序我试过了,没问题,应该就是返回最大间隔哪里有问题。不知道这下说明白没 本帖最后由 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-'0')*10+(arr-'0'))*60+(arr-'0')*10+(arr-'0') -( ((arr-'0')*10+(arr-'0'))*60+(arr-'0')*10+(arr-'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;
solve(&arr, sizeof(arr)/sizeof(arr), result);
printf("最大时间间隔: %s\n", result);
return 0;
}
superbe 发表于 2019-10-17 20:43
solve函数中result[]是一个局部变量,虽然返回了它的地址,但是它的内容在函数结束后发生了变化。
在main ...
原来如此,
那我可以把它定义成全局变量也可以,对吗? 可以的。char result1[]="23:59"; 变成全局变量。solve也不用return了。 superbe 发表于 2019-10-17 22:42
可以的。char result1[]="23:59"; 变成全局变量。solve也不用return了。
我明白了,感谢大佬的解答{:5_109:}
页:
[1]