Примечания как Adriano Repetti указаны в a comment и answer, что символ новой строки '\n'
, а не '/n'
.
Ваш исходный код может быть зафиксирован на работу, при условии, что буфер назначения достаточно велик:
while (*pros_id != '\n' && *pros_id != '\0')
*pros_id_line++ = *pros_id++;
*pros_id_line = '\0';
Этот код не содержит символ новой строки в скопированной буфере; достаточно легко добавить его, если вам это нужно.
Одним из преимуществ этого кода является то, что он делает один проход через данные до новой строки (или конца строки). Альтернатива делает два прохода через данные, один, чтобы найти символ новой строки, а другой, чтобы скопировать символ новой строки:
if ((end = strchr(pros_id, '\n')) != 0)
{
memmove(pros_id_line, pros_id, end - pros_id);
pros_id_line[end - pros_id] = '\0';
}
Это гарантирует, что строка заканчивается нуль; опять же, он опускает новую строку и предполагает, что в буфере pros_id_line
достаточно данных. Вы должны решить, что такое правильное поведение, когда в буфере нет новой строки. Возможно, достаточно скопировать буфер без новой строки в целевую область, или вы можете сообщить об ошибке.
Вы можете использовать strncpy()
вместо memmove()
но имеет более сложное условие цикла, чем memmove()
- он должен проверить наличие нулевого байта, а также счета, в то время как memmove()
только должен проверить счетчик. Вы можете использовать memcpy()
вместо memmove()
, если вы уверены, что нет никакого перекрытия между источником и целью, но memmove()
всегда работает, а memcpy()
иногда не работает (хотя только тогда, когда область источника и целевого объекта перекрывается), и я предпочитаю надежность над возможным неправильным поведением.
Обратите внимание, что установка буфера в ноль перед копированием строки в него является пустой тратой энергии. Части, которые вы собираетесь перезаписать с данными, не нужно обнулять. Части, которые вы не собираетесь перезаписывать с данными, также не нужно обнулять.Вы должны точно знать, какой байт нужно обнулить, поэтому зачем тратить время на обнуление чего-либо, кроме одного байта, который нужно обнулить?
(Единственное исключение - если вы имеете дело с конфиденциальными данными и обеспокоены тем, что некоторая функция, которую будет вызывать ваш код, может преднамеренно читать за пределами строки и обнаруживать части пароля или другие конфиденциальные данные. может быть целесообразно стереть память перед записью на нее новых данных. В целом, большинство людей не пишут такой код.)
вы пробовали 'strncpy'? –
Новая строка '\ n' не'/n' в любом случае я бы использовал 'strchar' для этого, посмотрите на это сообщение для примера: http://stackoverflow.com/questions/10651999/how-can- i-check-if-a-single-char-exists-in-ac-string/10652031 # 10652031 –
@FiddlingBits strncpy почти всегда неправильный инструмент .. в этом случае он совершенно не имеет значения. –