【问题标题】:strcat C not printing and int to char*strcat C 不打印和 int 到 char*
【发布时间】:2013-04-03 08:34:30
【问题描述】:

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

【问题讨论】:

    标签: c casting strcat


    【解决方案1】:

    不,它没有“正确”地做到这一点;你的代码很破。编译器在发出警告时并不想搞笑,他们通常知道自己在说什么,需要找出导致它触发警告的代码有什么问题。因为应该没有。

    在你的情况下,这个代码例如:

    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 this 退出函数,你需要考虑缓冲区管理,你不能原样返回response,因为它是一个局部变量,当函数退出。

    【讨论】:

    • 感谢全能的 C 大师,它完美运行。你让它看起来很容易哈哈。
    • @PatricioJerí 谢谢!我想我属于编程人群的一些(定义不明确)分区,实际上喜欢用 C 语言进行字符串操作。:)
    【解决方案2】:
    char* response = "RTSP/1.0 200 OK\nCSeq: "; 
    

    为您提供只读字符串文字。不能修改 this 的内容。

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

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

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

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

    【讨论】:

    • 我试过这个:char response[200] = "RTSP/1.0 200 OK\nCSeq:";并在之后打印一些东西进行调试,但它不会越过那条线。
    • 您确定它不是以下行 - strcat( response, cseq ); 失败了吗?尝试将未初始化的指针附加到 response 所以很可能会崩溃。
    【解决方案3】:

    如下

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

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

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

    (另见之前的讨论here)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2011-01-21
      • 2015-12-16
      相关资源
      最近更新 更多