Как лучше всего отформатировать очень длинные строковые константы в C?

У меня есть это:

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

person Theo Freeman    schedule 18.03.2019    source источник
comment
Это не компилируется, потому что вы забыли = во втором фрагменте. Помимо этого, я не вижу неопределенного поведения.   -  person Blaze    schedule 18.03.2019
comment
Возможный дубликат stackoverflow.com/questions/797318/   -  person Jose    schedule 18.03.2019
comment
@Blaze Я скомпилировал второй фрагмент (с = конечно, спасибо) с gcc -Wall -Wextra и не получил предупреждения. Расчетная длина строки была 10 вместо 6. Мне это кажется неопределенным поведением, хотя я подозреваю, что компилятор принял tab-indent как число ...   -  person Theo Freeman    schedule 18.03.2019
comment
@TheoFreeman Верно, он добавляет отступ на следующей строке к строковому литералу. Ознакомьтесь с ответом Вирсавии, чтобы найти гораздо лучшее решение.   -  person Blaze    schedule 18.03.2019
comment
@Blaze Кажется, что предложенное первое решение в ссылке Хосе ошибочно, тогда   -  person Theo Freeman    schedule 18.03.2019
comment
@TheoFreeman, честно говоря, это решение включает в себя лучшее решение, а также объясняет, что пробелы являются частью проблемы. Следует отметить, что контекст этого ответа - это SQL-запрос, поэтому лишние пробелы не являются большой проблемой.   -  person Blaze    schedule 18.03.2019


Ответы (2)


Вы можете использовать несколько строк, например:

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

Например. Думайте о "" как об операторе конкатенации во время компиляции; фактически, любого пробела между закрывающим " одной строки и открывающим " следующей будет достаточно.

person Bathsheba    schedule 18.03.2019

Лучшая идея - использовать для этого препроцессор, потому что он не использует память (имеет встроенную материю):

#define TEXT "jfsdkfnkd jfsn kjdsjkdsf ndjkksnfjkdsnf njdsjkfdnfkjdsfnd\
dkf dfhfhjfbdsfhjbffjsbdhfds"
strlen(TEXT);
person Igor Galczak    schedule 18.03.2019
comment
Это не улучшает форматирование, а только перемещает его в другое место. - person Gerhardh; 18.03.2019