На что нужно обратить внимание при копировании строк? - PullRequest
2 голосов
/ 21 ноября 2011

На какие факторы я должен обратить внимание при копировании строк в C?И что может пойти не так?

Я могу подумать, что мне нужно зарезервировать достаточно памяти перед копированием строки и убедиться, что у меня достаточно привилегий для записи в память (старайтесь избегать общих ошибок защиты), ноЕсть ли еще что-то, на что я должен обратить внимание при копировании строк?Есть ли дополнительные потенциальные ошибки?

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011
  • Убедитесь, что у вас достаточно места в буфере в месте назначения (т. Е. Заранее известно, сколько байт вы копируете). Это также означает, что исходная строка должна быть правильно завершена (нулевым символом, т.е. 0 = '\0').
  • Убедитесь, что строка назначения правильно завершена.
  • Если ваше приложение поддерживает набор символов, имейте в виду, что некоторые наборы символов могут иметь встроенные нулевые символы, в то время как некоторые могут содержать символы переменной длины.
2 голосов
/ 21 ноября 2011

Вам необходимо:

  1. выделить достаточно памяти для назначения (strlen (источник) + 1)

  2. убедитесь, что источник не равен NULL

  3. имеет дело с проблемами Unicode (длина строки может быть меньше, чем длина в байт)

2 голосов
/ 21 ноября 2011

C-строки - это обычно массивы ненулевых байтов, оканчивающиеся нулевым байтом.Подпрограммы, работающие с ними, получают указатель на байт (то есть на массив, начинающийся с этого байта).Вы должны позаботиться о том, чтобы зарезервированное место соответствовало.Узнайте о strcpy и strcat и их ограниченных контрагентах strncpy и strncat.Также около strdup.И не забудьте очистить завершающий байт до нуля (в частности, при достижении границы с strncpy и т. Д.).Некоторые библиотеки (например, Glib из GTK) предоставляют полезные служебные функции (например, g_strdup_printf) для построения строк.

Прочитайте документацию по всем функциям, которые я упомянул.

1 голос
/ 21 ноября 2011

Необходимо обратить внимание на определение строки в C: это последовательность символов, оканчивающаяся нулевым завершающим символом ('\ 0').

Все функции в string.h будут работать с этим предположением. Работайте с этими функциями, и с вами все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...