Как уже отмечали другие, для s
нет особого смысла, потому что a
может быть передано conversion
. И, опять же, malloc
для s
выделяет только один байт.
Вы увеличиваете i
до выполнения циклических тестов, поэтому вы должны использовать i-1
там. Кроме того, цикл заканчивается i
слишком большим.
Даже для вашего исходного кода выполнение int chr = getchar(); a[i] = chr;
и замена a[i-1]
на chr
могут немного упростить ситуацию.
Еще лучше, реструктуризируя использование for
вместо цикла do/while
, мы можем добавить еще несколько комментариев для каждого управляющего условия, а не большее отдельное выражение условия.
#define MAXN 1000
int
main(void)
{
char a[MAXN + 1];
int i;
for (i = 0; i < MAXN; ++i) {
// get the next character
int chr = getchar();
// stop on EOF
if (chr == EOF)
break;
// stop on newline
if (chr == '\n')
break;
// stop on non-digit
if (! isdigit(chr))
break;
// add digit to the output array
a[i] = chr;
}
// add EOS terminator to string
a[i] = 0;
unsigned long n = conversion(a);
printf("\n%lu\n",n);
return 0;
}