我首先尝试生成一个随机数并将其转换为字符串.它做得很好,但编译器给出了"警告:从不同大小的整数转换为指针".然后,这里的主要问题是我正在尝试连接字符串以构建响应,但由于某种原因,甚至第一个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);
Run Code Online (Sandbox Code Playgroud)
不,它没有"正确"地做到; 你的代码非常破碎.编译器在发出警告时并不是很有趣,他们通常知道他们在说什么,而是你需要弄清楚你的代码有什么问题导致它触发警告.因为应该没有.
在您的情况下,此代码例如:
char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );
Run Code Online (Sandbox Code Playgroud)
无效,并且使用session
好像它指向有效字符串很可能会调用未定义的行为.
您不能将事物"转换"为C中的字符串,除非它们是以0开头的字节数组,用于描述预期编码中的字符.
您需要使用eg 或类似的东西从随机数创建字符串sprintf()
:
const int session_id = rand() % (9999 - 1000 + 1) + 1000;
char session[32];
snprintf(session, sizeof session, "%d", session_id);
Run Code Online (Sandbox Code Playgroud)
当然,一旦你开始使用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);
Run Code Online (Sandbox Code Playgroud)
请注意,这session_id
从上面使用,但在一次调用中执行所有格式化snprintf()
,因此不需要会话ID的临时字符串版本.
当然,如果你想要return
这个函数,你需要考虑缓冲区管理,你不能response
按原样返回,因为它是一个局部变量,当函数退出时它将超出范围.
归档时间: |
|
查看次数: |
718 次 |
最近记录: |