代码之家  ›  专栏  ›  技术社区  ›  Peter

帮助gcc不要警告不要使用字符串文字格式字符串

  •  1
  • Peter  · 技术社区  · 15 年前

    所以,我有一个很好的数组,它包含了索引所索引的所有详细描述。

    为了将其转储到缓冲区中,我使用如下代码

    #define BUFFER_SIZE 40
    void format_verbose(uint32_t my_index,
                        char     my_buffer[BUFFER_SIZE])
      {
        snprintf(mY_buffer, BUFFER_SIZE, "%s", MY_ARRAY[my_index].description);
      }
    

    在某些情况下,当格式化字符串时,我需要在字符串中插入一些其他字符串。所以我想要的是这样的东西(本例中的描述包含 %s ).

    void format_verbose_with_data(uint32_t my_index,
                                  char     my_buffer[BUFFER_SIZE])
      {
        // ...
        snprintf(mY_buffer, BUFFER_SIZE, MY_ARRAY[my_index].description,
                 some_string);
      }
    

    我们的make文件设置为使用snprintf()发出警告(危险),警告被视为错误。所以,它不会编译。我只想关闭这一行的警告,尽管这有点危险,但我将控制字符串,并且我可以进行测试以确保它与调用它的每个值一起工作。

    void format_verbose_with_data(uint32_t my_index,
                                  char     my_buffer[BUFFER_SIZE])
      {
        // ...
        snprintf(mY_buffer, BUFFER_SIZE, "%s%s%s"
        MY_ARRAY[my_index].description1, some_string,
        MY_ARRAY[my_index].description2);
      }
    

    3 回复  |  直到 15 年前
        1
  •  4
  •   anon anon    15 年前

    还有一点,当你说:

    void format_verbose(uint32_t my_index,
                        char     my_buffer[BUFFER_SIZE])
    

    你真的是在浪费时间打字——说:

    void format_verbose(uint32_t my_index,
                        char     my_buffer[])
    

    或:

    void format_verbose(uint32_t my_index,
                        char     * my_buffer)
    
        2
  •  0
  •   DevSolar    10 年前

    snprintf() 正在复制 (似乎是这样),即你所拥有的只是一个或多个 "%s" strcpy() ,也许有一个 strlen() 首先检查源的长度?

    注意 strncpy() 虽然 不以null结束字符串

        3
  •  0
  •   Peter    10 年前

    经过一晚上的思考,我计划手动将输入字符串分割开来,方法是自己查找%s标记,然后将字符串separatley与它们自己的%s一起发送到snprintf()。在这种情况下,只允许使用1种格式字符串,这就不那么繁重了,但是尝试完全重新实现printf()样式的解析器会很糟糕。

    void format_verbose_with_data(uint32_t my_index,
                                  char     my_buffer[BUFFER_SIZE])
      {
        char    pre_description[BUFFER_SIZE];
        char    post_description[BUFFER_SIZE];
        int32_t offset = -1;
    
        offset = find_string(MY_ARRAY[my_index].description, "%s");
        ASSERT(offset >=0, "No split location!");
        // Use offset to copy the pre and post descriptions
        // Exercise left to the reader :-)
        snprintf(mY_buffer, BUFFER_SIZE, "%s%s%s"
                 pre_description, some_string, post_description);
      }