> Да, да, спасибо. Одна строка, три инта разделённых пробелами, завершается новой строкой.
> Эта штука вызывается для каждого процесса (которых спавнится тысячи подряд) и
> инлайнится, и уж точно я хочу избежать isdigits и isspace,Ты сначала напиши, померь скорость, а потом думай где тормозит. Если ctype.h будет слишком медленным, напишешь свои аналоги. Заинлайнишь. Будет тебе щщасте.
> и scanf (довольно вредная дрянь, 99% времени я провишу в ней).
> А можно же изменять инты, выделенные кем-то другим? Это именно то,
> что я пытаюсь сделать. Как я ни пробовал выделять инты на
> хипе (malloc и передать 3 указатель на 3 указателя на инты
> емнип), компилятор был недоволен (хотя и работало).
Эмм... Ты пытаешься избежать isdigits и isspace, но при этом думаешь о динамическом выделении памяти? Если тебе нужна скорость, кучу надо выкидывать в первую очередь.
Но если тебе очень надо, то:
int main() {
unsigned *arr = malloc(3 * sizeof(unsigned));
char* bufs[] = {
"1 2 3", " 12\t398746 \n 2397\n\n",
"12345", "1 2, -100"
};
for(size_t i = 0; i < sizeof(bufs)/sizeof(bufs[0]); i ++) {
int ret = get_vals(bufs[i], arr);
printf("ret: %d; vals: (%u, %u, %u)\n", ret, arr[0], arr[1], arr[2]);
}
return 0;
}
УМВР
upd.
Или тебе нужен массив указателей на инты? Ты в курсе что это _ещё_ хуже, с точки зрения производительности? Если да, то смотри:
int get_vals(const char *buf, unsigned* var[3]) {
/// ...
*var[i] = чему-то-там
/// ...
}
int main () {
unsigned **arr = malloc(3 * sizeof(unsigned));
unsigned a, b, c;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
/// ...
printf("ret: %d; vals: (%u, %u, %u)\n", ret, *arr[0], *arr[1], *arr[2]);
}