【问题标题】:How do you best format very long string constants in C? [duplicate]你如何最好地格式化 C 中很长的字符串常量? [复制]
【发布时间】:2019-03-18 12:38:35
【问题描述】:

我有这个:

char * str = "hahahahahihihihihohohohohahahahahihihihihohohohohahahahahihihihihohohohohahahahahihihihihohohohohahahahahihihihihohohohohahahahahihihihihohohoho\0";

如何正确设置格式,打破 80 列? 使用:

char * str = "foo\
    bar";

似乎是一个非常糟糕的主意,它会导致未定义的行为,使strlen() 返回无意义的值

编辑:这是我正在谈论的未定义行为:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *s = "haha\
               hihi\0";

    unsigned i = strlen(s);

    printf("Length: %i\n", i);

    return 0;
}

imperator@RomaAeterna ~/P/C/undefined> gcc -Wall -Wextra undefined.c 
imperator@RomaAeterna ~/P/C/undefined> ./a.out
Length: 14

【问题讨论】:

  • 这不会编译,因为您忘记了第二个 sn-p 中的 =。除此之外,我看不到未定义的行为。
  • @Blaze 我用gcc -Wall -Wextra 编译了第二个sn-p(当然是=,谢谢)并且没有收到任何警告。计算出的字符串长度是 10,而不是 6。这对我来说似乎是未定义的行为,尽管我怀疑编译器将制表符缩进作为数字......
  • @TheoFreeman 没错,它将下一行的缩进添加到字符串文字中。查看 Bathsheba 的答案以获得更好的解决方案。
  • @TheoFreeman 公平地说,该解决方案包括更好的解决方案还解释了空格是问题的一部分。需要注意的一点是,该答案的上下文是 SQL 查询,因此额外的空格不是大问题。

标签: c string formatting strlen


【解决方案1】:

你可以像这样使用多行:

char* str = "line1"
            "line2"
            "line3";

例如。将"" 视为编译时连接运算符;事实上,一个字符串的结尾 " 和下一个字符串的开头 " 之间的任何空格就足够了。

【讨论】:

    【解决方案2】:

    最好的办法是为此使用预处理器,因为这不使用内存(在嵌入式中有问题):

    #define TEXT "jfsdkfnkd jfsn kjdsjkdsf ndjkksnfjkdsnf njdsjkfdnfkjdsfnd\
    dkf dfhfhjfbdsfhjbffjsbdhfds"
    
    strlen(TEXT);
    

    【讨论】:

    • 这不会改善格式,只会将其移动到另一个地方。
    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2011-11-12
    • 2014-07-12
    • 2019-02-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多