Дополнительно
Как мне обединить константный/строковые литералы в C?
Я'м работает в C, и мне нужно объединить несколько вещей.
Сейчас у меня есть это:
message = strcat("TEXT ", var);
message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));
Теперь, если у вас есть опыт работы в C я'м уверена, что вы понимаете, что это дает ошибку сегментации при попытке запустить его. Так как я могу обойти это?
321
17
В C, то "строки" и просто
голец
массивы. Таким образом, вы можете't напрямую соединить их с прочим "ниточки" по.Вы можете использовать функции strcat
функция, которая добавляет строку, на которую указывает
srcв конце строки, на которую указывает
назначение`:Вот пример из cplusplus.com:
Для первого параметра, необходимо обеспечить себе буфер назначения. Буфер назначения должен быть буфер char массив. Е. Г.:
буфер типа char[1024];
Убедитесь, что, что первый параметр имеет достаточно места для хранения, что вы'вновь пытается копировать в него. Если вам доступно, это безопаснее, чтобы использовать функции, такие как:
предоставляя strcpy_s
иstrcat_s
, где вы явно не укажите размер буфера назначения.Note: строковый литерал не может быть использован в качестве буфера, так как он является постоянным. Таким образом, вы всегда должны выделить char массив для буфера.
Возвращаемое значение функции strcat` можно просто игнорировать, он просто возвращает тот же указатель, как был передан в качестве первого аргумента. Он есть для удобства, и позволяет цепи звонки в одну строку кода:
Так что ваша проблема может быть решена следующим образом:
Избегайте использования
функции strcat
в C код. Самый чистый и, главное, безопасным способом является использованиеи snprintf
:Некоторые комментаторы подняли вопрос о том, что количество аргументов не соответствует строке формата и код будет по-прежнему компилироваться, но большинство компиляторов уже выдавать предупреждение в этом случае.
Люди, используйте ул.<б>Н</б>КПЮ(), ул.<б>Н</б>кат(), или S<б>Н</б>функции printf(). <БР>превышение места в буфере мусор все остальное в памяти! <БР>(и не забудьте оставить пространство для трейлинг-нулевой '\0' характер!)
Строки также могут быть объединены во время компиляции.
Также malloc и realloc полезны, если вы не'т знать заранее, сколько строк, объединяемых.
Не забудьте инициализировать буфер вывода. Первый аргумент в функции strcat должен быть нуль-терминированная строка достаточно дополнительное пространство, выделенное для итоговой строке:
Как люди отмечали обработки строк значительно улучшилось. Так что вы можете научиться использовать библиотеку строку C++ вместо C-строки. Однако вот решение на C
Я не знаю, насколько это правильно/безопасно, но сейчас я не мог найти лучший способ, чтобы сделать это в ANSI С.
Лучший способ сделать это без того ограниченный размер буфера с помощью asprintf()
Это неопределенное поведение, чтобы попытаться изменить строковые литералы, что-то вроде:
попытается сделать. Он будет пытаться лавировать на " имя " строку в конец строкового литерала `"Привет " Ну, которая не определена.
Попробовать что-то этого. Это достигает, что вы пытаетесь сделать:
Это создает буферную зону, что это можно изменить и затем копирует как строковый литерал и другой текст. Просто будьте осторожны с переполнения буфера. Если вы контролируете входных данных (или проверить его, прежде чем руки), это's прекрасно, чтобы использовать фиксированную длину буфера, как у меня.
В противном случае, вы должны использовать стратегии по смягчению последствий, таких как выделение достаточного объема памяти из кучи, чтобы убедиться, что вы можете справиться с этим. Другими словами, что-то вроде:
Первый аргумент функции strcat() должен быть способен держать достаточно места для сцепленную строку. Поэтому выделить буфер с достаточно места, чтобы получить результат.
функции strcat() будет объединять второго аргумента, первый аргумент, и сохранить результат в первый аргумент, возвращаемый тип char* - это просто это первый аргумент, и только для вашего удобства.
Вы не получите выделенную строку с первой и второй аргумент сцепляются, что я'd не думаю, что вы ожидали, основываясь на коде.
Вы можете написать свою функцию, которая делает то же самое как
функции strcat ()
, но это вовсе't изменить что-либо:Если обе строки вместе более 1000 символов, то оно будет резать строку на 1000 символов. Вы можете изменить значение
MAX_STRING_LENGTH
, чтобы удовлетворить ваши потребности.Если у вас есть опыт в C можно заметить, что строки являются только char массивы, где последний символ является символом null.
Сейчас это совсем неудобно, так как вам придется искать последний символ для того, чтобы что-то добавить.
функции strcat
будет делать это за вас.Поэтому функции strcat поиск по первым аргументом для нуль-символа. Тогда замените это второй аргумент'ы содержание (пока что заканчивается нулем).
Теперь давайте's идти через ваш код:
Вот вы что-то добавляя к указатель к тексту и"текст" и (типа на "текст" это константный тип char*. Указатель.).
Что, как правило, не будет работать. Также изменения в "текст" и массив будет работать не так, как обычно оно находится в постоянном сегменте.
Что может лучше работать, за исключением того, что ты опять пытаешься изменить статические тексты. функции strcat не выделяя новую память для результата.
Я бы предложил сделать что-то вроде этого вместо:
Читать документацию
ом
, чтобы проверить это's параметры.А теперь важный момент:
Убедитесь, что буфер имеет достаточно места, чтобы вместить текст и нулевой символ. Есть несколько функций, которые могут помочь вам, например, strncat и специальные версии с printf, что выделить буфер для вас. Не обеспечив размер буфера приведет к повреждению памяти и удаленное использование багов.
Если у вас есть чар[fixed_size], а не char, то вы можете использовать один, творческих макрос, чтобы сделать это все сразу с
<<соиь<<как
заказ (на"а % - ов разрозненных %з\п то", то "чем-то", "В Е формате и"). Если вы работаете со встроенными системами, этот метод также позволяет оставить malloc и семьи большие `ефункции, такие как
и snprintf()` (это держит dietlibc от слишком жаловаться *е)Вы пытаетесь скопировать строку в адрес статически. Вам нужно кота в буфер.
В частности:
...СНиП...
пунктом
...СНиП...
http://www.cplusplus.com/reference/clibrary/cstring/strcat.html
Там'ы пример здесь.
Это было мое решение
но нужно указать, сколько строк вы'ре собирается объединить
Попробуйте что-то похожее на это: