0

我首先尝试生成一个随机数并将其转换为字符串。它正确执行,但编译器给出“警告:从不同大小的整数转换为指针”。然后,这里的主要问题是我试图连接字符串以构建响应,但由于某种原因,甚至第一个 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);
4

3 回答 3

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()你也可以将它用于所有格式,并且 dropstrcat()无论如何都是一个非常锋利的工具。

此外,正如 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 的临时字符串版本。

当然,如果你想returnthis 退出函数,你需要考虑缓冲区管理,你不能按原样返回response,因为它是一个局部变量,当函数退出时会超出范围。

于 2013-04-03T08:37:24.340 回答
3
char* response = "RTSP/1.0 200 OK\nCSeq: "; 

给你一个只读的字符串文字。你不能修改这个的内容。

一个快速而肮脏的解决方法是更改response​​为具有硬编码长度的可写:

char response[200] = "RTSP/1.0 200 OK\nCSeq: "; 

更好的方法可能是计算各种字符串组件的长度,然后malloc计算response. 如果您这样做,请务必free稍后再致电。

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

于 2013-04-03T08:36:43.097 回答
0

与以下

char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

您将随机数解释为内存地址,这是合法的,但可能不是您想要做的。结果是您将随机内存转储到响应中,如果幸运的话,只会获得垃圾,最坏的情况是分段错误。如果您想将其转换为字符串(例如 1234 -> "1234"),您应该使用类似

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

(另请参见此处的先前讨论)。

于 2013-04-03T08:46:36.857 回答