Странная нотация формата C fprintf

Пытаясь выяснить ошибку повреждения стека в функции, я заметил этот фрагмент кода:

fprintf( fp, "\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c"
             "%12s %2c %12s", 
             xys_field[3],      x,
             xyzFunc(val1, 0),  x, 
             xyzFunc(val2, 0),  x, 
             xyzFunc(val3, 0),  x,
             xyzFunc(val4, 0),  x, 
             xyzFunc(val5, 0),  x, 
             xyzFunc(val6,0) );

Я спрашиваю об этой строке "\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c" "%12s %2c %12s", я даже не понимаю, как это компилируется, так как я никогда не видел, чтобы два формата следовали друг за другом вот так. Спасибо за любую помощь.


person jn1kk    schedule 14.05.2012    source источник
comment
возможный дубликат конкатенации строк с использованием препроцессора   -  person user7116    schedule 14.05.2012
comment
Хорошо, я думаю, из множества ответов вы поняли, что таким образом можно объединять строки;) Можете ли вы рассказать нам что-нибудь о типе xys_field, x и возвращаемом значении xyzFunc (даже если я думаю, что это может напечатать мусор но это не повредит стек).   -  person Adriano Repetti    schedule 14.05.2012
comment
@Adriano Ошибка повреждения стека появляется в конце функции. И таких заявлений десятки. Сомневаюсь, что это он. В любом случае спасибо. Я позабочусь об остальном.   -  person jn1kk    schedule 14.05.2012
comment
Это не в тему, но у меня была такая проблема, обычно компилятор размещает переменную в стеке в самом начале функции (независимо от того, где они объявлены). Я решил просто шаг за строкой в ​​отладке, одним глазом глядя на регистр ESP (кстати, в конце концов это было неправильное соглашение о вызовах :|)   -  person Adriano Repetti    schedule 14.05.2012


Ответы (3)


Это не два формата — обратите внимание на отсутствие запятой или чего-то еще, кроме пробела. Это синтаксис C для продолжения длинной строки. В C они эквивалентны:

"abc" "def"
"abcdef"

Обратите внимание, что это работает только для строковых литералов; вы не можете конкатенировать строковые переменные. Это синтаксическая ошибка:

string1 string2
person Amadan    schedule 14.05.2012
comment
Хаха спасибо. Не могу поверить, что меня этому никогда не учили/не научили этому самостоятельно. Спасибо. Принять через мин. - person jn1kk; 14.05.2012

В C сопоставленные строковые литералы (с одним пробелом между ними) обозначают одну строку:

int main()
{
    puts("Hello, " "world!");
    return 0;
}

печатает Hello, world!.

person Fred Foo    schedule 14.05.2012

Это не имеет ничего общего со спецификаторами формата и имеет отношение к тому, что C позволяет вам разделить файл разбить строковый литерал на несколько частей (например, поперек строк для ясности) и объединить их.

person user7116    schedule 14.05.2012