strcat C不打印,int为char *

时间:2013-04-03 08:34:30

标签: c casting strcat

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

3 个答案:

答案 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)。