Задумка этого кода в том, чтобы прочитать три инта из строчки? Инты разделены пробельными символами?На, держи. Код совсем уж безбажен (как минимум там может быть переполнение unsigned в my_atoi), но навскидку это должно выглядеть так. Длинее чем у тебя, но зато читабельнее: проще понять и проще мейнтейнить
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
static const char *skip_spaces(const char *p) {
while(isspace(*p) && *p != '\0')
p ++;
return p;
}
static const char *skip_digits(const char *p) {
while(isdigit(*p) && *p != '\0')
p ++;
return p;
}
// my_atoi: Преобразует первые len байт строки p в unsigned, и возвращает.
// NB: не проверяет корректность строки, это забота вызывающего кода
// Rationale: Библиотечные C'шные функции совершенно убоги, любят менять
// указатели, или хотят '\0' в конце, не умеют сообщать об ошибках,... У каждой
// свои косяки, нет ни одной пристойной. Проще самостоятельно проверить ввод и
// самостоятельно преобразовать.
static unsigned my_atoi(const char* p, size_t len) {
unsigned ret = 0;
for(size_t i = 0; i < len; i ++) {
ret *= 10;
ret += p[i] - '0';
}
return ret;
}
// get_vals: читает из buf три числа, разделённых пробельными символами, и
// пишет их в массив vars.
// Возвращает количество успешно прочитанных чисел.
int get_vals(const char *buf, unsigned var[3]) {
const char *p = buf;
if(buf == NULL) {
fprintf(stderr, "KILL YOURSELF MOTHERFUCKER, BUF CANNOT BE NULL\n");
exit(-1);
}
for(size_t i = 0; i < 3; i ++) {
const char *start = skip_spaces(p);
const char *end = skip_digits(start);
if(start == end)
return i;
var[i] = my_atoi(start, end - start);
p = end;
}
return 3;
}
int main() {
unsigned arr[3];
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;
}
Вывод:
ret: 3; vals: (1, 2, 3)
ret: 3; vals: (12, 398746, 2397)
ret: 1; vals: (12345, 398746, 2397)
ret: 2; vals: (1, 2, 2397)