strcat C未打印,int到char*

strcat C未打印,int到char*,c,casting,strcat,C,Casting,Strcat,我首先尝试生成一个随机数并将其转换为字符串。它可以正确地执行此操作,但编译器会发出警告:从不同大小的整数转换为指针。然后,这里的主要问题是,我试图连接字符串以构建响应,但由于某些原因,即使第一个strcat也无法工作,它只是在那里停止 char *name, *cseq; srand (time(NULL)); char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 ); char* response = "RTSP/1.0 20

我首先尝试生成一个随机数并将其转换为字符串。它可以正确地执行此操作,但编译器会发出警告:从不同大小的整数转换为指针。然后,这里的主要问题是,我试图连接字符串以构建响应,但由于某些原因,即使第一个strcat也无法工作,它只是在那里停止

char *name, *cseq;
srand (time(NULL));
char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

char* response = "RTSP/1.0 200 OK\nCSeq: ";                     
strcat( response, cseq );                   
strcat ( response, "\n" );                      
strcat ( response, "Session " );
strcat ( response, session );                       
strcat ( response, "\n\n" );

printf("Response: %s", response);
为您提供只读字符串文本。您不能修改此文件的内容

一个快速而肮脏的解决方案是将响应更改为具有硬编码长度的可写:

char response[200] = "RTSP/1.0 200 OK\nCSeq: "; 
更好的方法可能是计算各种字符串组件的长度,然后为响应计算malloc内存。如果你这样做,一定要稍后打免费电话


除了unwind指出的会话问题外,请注意,在您的示例中,cseq未初始化,因此取消对它的引用将导致崩溃。

不,它不能正确执行;你的密码很坏。当编译器发出警告时,他们并不想显得有趣,他们通常知道自己在说什么,而您需要找出代码中的错误是什么导致它触发了警告。因为应该没有

在您的情况下,此代码例如:

char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );
无效,如果将会话当作指向有效字符串来使用,则很可能会调用未定义的行为

在C语言中,不能将内容强制转换为字符串,除非它们是以0结尾的字节数组,用于描述以预期编码开始的字符

您需要从随机数中创建字符串,例如使用sprintf或类似工具:

const int session_id = rand() % (9999 - 1000 + 1) + 1000;
char session[32];

snprintf(session, sizeof session, "%d", session_id);
当然,一旦你开始使用snprintf,你也可以将它用于所有的格式设置,并删除strcat,这是一个非常锋利的工具

此外,正如simonc所指出的,不能像现在这样修改字符串。您可能应该有如下内容:

char response[512];

snprintf(response, sizeof response, "RTSP/1.0 200 OK\nCSeq: %s\nSession %d\n\n",
         cseq, session_id);
printf("Response: '%s'", response);
注意,这使用了上面的session_id,但是在一次对snprintf的调用中进行了所有格式化,因此不需要会话id的临时字符串版本

当然,如果您想将其从函数中返回,您需要考虑缓冲区管理,您不能按原样返回响应,因为它是一个局部变量,当函数退出时将超出范围。

如下所示

char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );
您将随机数解释为内存地址,这是合法的,但可能不是您想要做的。 结果是,您将随机内存转储到响应中,如果幸运的话,只获得垃圾,最坏的情况是分段错误。 如果要将其转换为字符串,例如1234->1234,则应使用

char session[6];
snprintf(session,6, "%d", rand() % (9999 - 1000 + 1) + 1000 );

另请参见前面的讨论。

我尝试了以下方法:char response[200]=RTSP/1.0 200 OK\nCSeq:;然后打印一些东西进行调试,但它不会超过那一行;这是失败吗?它试图将一个未初始化的指针附加到响应中,所以很可能会崩溃。感谢全能的C大师,它工作得完美无缺。“你让它看起来很简单,哈哈。”帕特里西奥·杰里,谢谢!我想我属于编程人群中的某个定义不清的分区,它实际上喜欢在C中进行字符串操作:
char session[6];
snprintf(session,6, "%d", rand() % (9999 - 1000 + 1) + 1000 );