C:如何用函数的结果初始化字符串?
首先,我是C语言的新手,对它只有一个非常基本的了解。我还没有完全理解指针和内存管理的概念,所以我仍然从Java的角度来理解它——所以任何指向正确方向的“指针”都会受到欢迎。(请原谅双关语) 我有一个函数,可以将秒的整数转换为“天:小时:分钟:秒”格式的字符串 我试图通过对整数调用该函数来初始化字符串,但是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)
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语言书。这可能很有用: