我有这个功能someoneDidSomething(),它意味着产生一个像"曼迪爱耶稣!"这样的随机短语.例如.
问题是,当我只调用它一次并退出程序时,它工作得很好.即使我反复拨打该程序几次.但是当我在循环中调用它时,输出看起来像下面的图像.
PS:过了一段时间我得到了一个分段错误.
我很困惑:D - 这没有任何意义.
void main ()
{
for (int i = 0; i <= 500; i++)
{
char message[255];
strcpy (message, someoneDidSomething());
printf ("Because %s\n", message);
sleep (1);
}
}
char* someoneDidSomething()
{
static char message[255];
strcat (message, getPerson());
strcat (message, " ");
strcat (message, getVerb());
strcat (message, " ");
strcat (message, getSomething());
strcat (message, ".");
return message;
}
Run Code Online (Sandbox Code Playgroud)
称为一次输出:
Because Mandy loved Jesus.
Run Code Online (Sandbox Code Playgroud)
在for循环中调用:
Because Mandy loved Jesus.Hammond felt the World.Ashlynn knew Jesus.
Run Code Online (Sandbox Code Playgroud)
这里:
static char message[255];
strcat (message, getPerson());
Run Code Online (Sandbox Code Playgroud)
它是第一次工作,因为全局内存(static在大多数系统中归零,虽然添加一个= {0};没有伤害),所以strcat行为就像strcpy.
但随后的电话会保留价值message.message增长和增长,所以不是你想要的结果,一段时间后,缓冲区溢出会触发分段错误.
你需要strcpy第一步.
static char message[255];
strcpy (message, getPerson());
Run Code Online (Sandbox Code Playgroud)
由于您在调用者中复制结果,为什么不直接传递缓冲区:
char message[255];
someoneDidSomething(message);
Run Code Online (Sandbox Code Playgroud)
然后你的例程开始于:
void someoneDidSomething(char *message)
{
strcpy(message, getPerson());
Run Code Online (Sandbox Code Playgroud)
你也可以考虑单个sprintf而不是所有那些函数调用......
并且不返回任何东西(不需要).还允许在多线程环境中安全地调用您的方法(如果结果字符串的长度不超过缓冲区的长度,则是安全的,永恒的问题)