Это была не проблема с вашей функцией atoi_me()
, а проблема с тем, как вы получили свой ввод. Ваша реализация показывает некоторую слабость в вашем понимании того, как работает scanf()
. Это не проблема сама по себе, в конце концов, ошибки — это часть процесса обучения.
Как правило, безопаснее сначала собрать ввод в буфер, потому что scanf()
из стандартного ввода слишком сильно зависит от пользователя программы, чтобы ввести ввод именно так, как вы ожидаете. В этом случае особого вреда не будет, так как вам нужна только одна строка ввода. Но, как правило, программа обрабатывает несколько строк ввода, и scanf()
может застрять при возникновении ошибки. Итак, вы можете использовать что-то вроде этого, чтобы вместо этого получить строку ввода:
char line[MAXLINESIZE];
if (fgets(line, MAXLINESIZE, stdin) == 0) {
fprintf(stderr, "no input was provided!\n");
return 0;
}
Как упоминалось в другом месте, %c
— это неправильный спецификатор формата, который следует использовать для ввода, которое вы собираете. Поскольку вам нужны десятичные цифры, семейство *scanf()
имеет спецификатор формата, позволяющий собирать только эти символы.
char number[MAXSIZE];
if (sscanf(line, " %[0-9]", number) != 1) {
fprintf(stderr, "no number found in input: %s", line);
return 0;
}
Здесь я использую line
, полученный с помощью fgets()
, и анализирую часть ввода, содержащую цифры. Ведущий пробел заставляет sscanf()
пропускать символы пробела, ведущие к цифрам.
person
jxh
schedule
17.04.2013
number = (number * 10)
всегда будет0
. - person   schedule 17.04.2013*numstring
и'0'
оба уже повышены доint
до того, как произойдет вычитание. Код OP в порядке, его ввод должен быть неправильным. - person Carl Norum   schedule 17.04.2013main()
? Может быть, мы сможем помочь вам найти вашу ошибку там. - person Carl Norum   schedule 17.04.2013char number[MAXSIZE]
иscanf("%s", number)
иatoi_me(number)
- person BLUEPIXY   schedule 17.04.2013main
обратно в исходный вопрос. Проблема действительно есть. - person Carl Norum   schedule 17.04.2013