我首先尝试生成一个随机数并将其转换为字符串。它做得很好,但编译器给出了“警告:从不同大小的整数转换为指针”。然后,这里的主要问题是我正在尝试连接字符串以构建响应,但由于某种原因,甚至第一个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);
答案 0 :(得分:8)
不,它没有“正确”地做到;你的代码非常破碎。编译器在发出警告时并不是很有趣,他们通常知道他们在说什么,并且你谁需要弄清楚你的代码有什么问题导致它触发警告。因为应该没有。
在您的情况下,此代码例如:
char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );
无效,并且使用session
就像它指向有效字符串一样,很可能会调用未定义的行为。
你不能把东西“转换”成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的临时字符串版本。
当然,如果你想要return
这个函数,你需要考虑缓冲区管理,你不能按原样返回response
,因为它是一个本地变量函数退出时超出范围。
答案 1 :(得分:3)
char* response = "RTSP/1.0 200 OK\nCSeq: ";
为您提供只读字符串文字。您无法修改此内容。
快速而肮脏的修复方法是将response
更改为可写入的硬编码长度:
char response[200] = "RTSP/1.0 200 OK\nCSeq: ";
更好的方法可能是为malloc
计算各种字符串组件的长度,然后计算response
内存的长度。如果您这样做,请务必稍后致电free
。
除了unwind指出的session
问题之外,请注意cseq
在您的示例中未初始化,因此取消引用它会崩溃。
答案 2 :(得分:0)
使用以下
char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );
您将随机数解释为内存地址,这是合法的,但可能不是您想要做的。 结果是你将随机内存转储到响应中,获得你是否幸运只有垃圾,以及最坏的分段错误。 如果您想将其转换为字符串(例如1234 - >“1234”),您应该使用类似
的内容char session[6];
snprintf(session,6, "%d", rand() % (9999 - 1000 + 1) + 1000 );
(另见前面的讨论here)。