У меня проблема с использованием void *. Как мне сделать, чтобы использовать эту функцию clean_buffer для массивов int и float (?)
blockquote>Другие упоминали полезные вещи, такие как необходимость
sizeof
найти размер, приведение не требуется и альтернативы используйтеcalloc()
для нулевого инициализированного выделения памяти.
Добавить:
sizeof * object_pointer
Используйте
sizeof *object_pointer
, чтобы найти размер. Он менее подвержен ошибкам, его легче просматривать и поддерживать, чем кодировать в типе.// clean_buffer( (float *)pf, 10); // clean_buffer( (int *)pi, 10); // cast not needed clean_buffer(pf, sizeof *pf * 10); // No need to mention type! clean_buffer(pi, sizeof *pi * 10);
volatile
Очистка памяти после ее окончательного использования склонна к оптимизации, а затем веская причина для не использовать
memset()
, когда память безопасность вызывает беспокойство. Вместо этого используйтеvolatile
, чтобы не допустить оптимизации самогоclean_buffer()
.void clean_buffer(void *ptr, size_t n) { volatile unsigned char *vuc = ptr; for(size_t i = 0; i < n; i++) vuc[i]=0; } }
Это - то, которое я использую:
^(?:(?:[\+]?(?<CountryCode>[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?<AreaCode>[\d]{3})[\-/)]?(?:[ ]+)?)?(?<Number>[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?<Ext>[\d]{1,5}))?$
Я получил его от RegexLib, которому я верю.
Этот regex работает точно, как Вы хотите со своими примерами:
Regex regexObj = new Regex(@"\(?(?<AreaCode>[0-9]{3})\)?[-. ]?(?<Exchange>[0-9]{3})[-. ]*?(?<Suffix>[0-9]{4})[-. x]?(?<Extension>[0-9]{3})");
Match matchResult = regexObj.Match("1 (303) 555 -1234-122");
// Now you have the results in groups
matchResult.Groups["AreaCode"];
matchResult.Groups["Exchange"];
matchResult.Groups["Suffix"];
matchResult.Groups["Extension"];
Полоса что-либо это не цифра сначала. Затем все Ваши примеры уменьшают до:
/^1?(\d{3})(\d{3})(\d{4})(\d*)$/
Поддерживать все коды страны немного более сложно, но то же общее правило применяется.