C:如何用函数的结果初始化字符串?

C:如何用函数的结果初始化字符串?,c,arrays,string,initialization,C,Arrays,String,Initialization,首先,我是C语言的新手,对它只有一个非常基本的了解。我还没有完全理解指针和内存管理的概念,所以我仍然从Java的角度来理解它——所以任何指向正确方向的“指针”都会受到欢迎。(请原谅双关语) 我有一个函数,可以将秒的整数转换为“天:小时:分钟:秒”格式的字符串 我试图通过对整数调用该函数来初始化字符串,但是 const char * timeConvert(int secs){ ... return("%d:%d:%d:%d",days,hours,minutes,seconds)

首先,我是C语言的新手,对它只有一个非常基本的了解。我还没有完全理解指针和内存管理的概念,所以我仍然从Java的角度来理解它——所以任何指向正确方向的“指针”都会受到欢迎。(请原谅双关语)

我有一个函数,可以将秒的整数转换为“天:小时:分钟:秒”格式的字符串

我试图通过对整数调用该函数来初始化字符串,但是

const char * timeConvert(int secs){
    ...
    return("%d:%d:%d:%d",days,hours,minutes,seconds);
}

int main(){
    char time[11] = timeConvert(61);
    printf(time);
    return 0;
}
“..”是将转换为天/小时/分钟/秒的代码,与问题无关

使用这段代码,我在“char-time[11]=timeConvert(61);”行上得到一个错误,说“error:invalid initializer”

如果我拆下那条线,换上这条干管

int main()
{
    printf(timeConvert(61));
    return 0;
}
…该程序似乎正在编译,但由于出现“问题导致程序停止正常工作”错误而崩溃

有人能告诉我为什么这些方法不起作用,以及如何解决这个问题吗


基本上,我想输入一个整数到一个函数中,该函数以“天:小时:分钟:秒”的格式返回一个字符串,然后我可以将其打印到控制台。

如果要从函数中返回字符串,必须使用
sprintf()
。请参见下面链接中的示例。有了它,您可以格式化输出并将其存储在字符串中


为了使应用程序保持打开状态以进行调试,您可以在main中添加一个
scanf()
,或者在返回0之前添加一个
while(1)
,作为最后一行,以防止应用程序自行关闭。

如果要从函数中返回字符串,则必须使用
sprintf()
。请参见下面链接中的示例。有了它,您可以格式化输出并将其存储在字符串中


为了使应用程序保持打开状态以进行调试,您可以在main中添加一个
scanf()
,或者在返回0之前的最后一行添加一个
while(1)
,以防止应用程序自行关闭。

这并不是您所认为的:

return("%d:%d:%d:%d",days,hours,minutes,seconds);
这实际上是一个逗号运算符序列。逗号运算符按顺序计算每个表达式,整个表达式具有最后一个表达式的值。因此,这与:

return seconds;
应该抛出编译器警告

您也不能这样做:

char time[11] = timeConvert(61);
因为
timeConvert
返回一个
char*
,而
time
是一个数组

您可能希望将数组传递给此函数,然后使用
sprintf
填充该函数

void timeConvert(char time[], int secs){
    ...
    sprintf(time,"%d:%d:%d:%d",days,hours,minutes,seconds);
}

int main(){
    // make this long enough for the NULL terminator
    // plus some extra chars in case you pass in a larger value
    char time[15];
    timeConvert(time,61);
    printf(time);
    return 0;
}

还要注意,
时间
更大。如果
小时
分钟
都是两位数,则字符串的总长度为11个字符加上1个空终止符,总共12个字符。将其定义为
char-time[11]
并没有给您足够的空间,您最终会写过数组的末尾,导致未定义的行为。

这并不是您所认为的:

return("%d:%d:%d:%d",days,hours,minutes,seconds);
这实际上是一个逗号运算符序列。逗号运算符按顺序计算每个表达式,整个表达式具有最后一个表达式的值。因此,这与:

return seconds;
应该抛出编译器警告

您也不能这样做:

char time[11] = timeConvert(61);
因为
timeConvert
返回一个
char*
,而
time
是一个数组

您可能希望将数组传递给此函数,然后使用
sprintf
填充该函数

void timeConvert(char time[], int secs){
    ...
    sprintf(time,"%d:%d:%d:%d",days,hours,minutes,seconds);
}

int main(){
    // make this long enough for the NULL terminator
    // plus some extra chars in case you pass in a larger value
    char time[15];
    timeConvert(time,61);
    printf(time);
    return 0;
}

还要注意,
时间
更大。如果
小时
分钟
都是两位数,则字符串的总长度为11个字符加上1个空终止符,总共12个字符。将其定义为
char time[11]
并没有给您足够的空间,您最终会写入数组末尾,导致未定义的行为。

让开发人员将字符数组作为参数传递,并使用SprintFan,并注意编译器警告,当然应该为
return
行给出它。你不能通过猜测来理解C字符串是如何工作的,实际上你必须阅读C语言书中关于字符串处理的章节。在此之前,是关于数组和指针的章节。堆栈溢出不是研究的替代品。C中的字符串是
'\0'
终止的字符数组。与它们一起工作与Java非常不同。我建议您阅读一本C语言书。这可能很有用:让开发人员将字符数组作为参数传递并使用SprintFan,并注意编译器警告,这些警告肯定应该针对
返回
行给出。您无法通过猜测来了解C字符串是如何工作的,实际上,您必须阅读C语言书中关于字符串处理的章节。在此之前,是关于数组和指针的章节。堆栈溢出不是研究的替代品。C中的字符串是
'\0'
终止的字符数组。与它们一起工作与Java非常不同。我建议你读一本C语言书。这可能很有用: