Я пытаюсь выяснить функцию atoi()
из stdlib.h
. Согласно K & R это выглядит следующим образом:
int atoi(char s[]) {
int n, i;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}
Как я понимаю, функция atoi()
из stdlib.h
должна получать строку любых символов в качестве входных данных и буквально выводить только цифры, как показано ниже:
Код 1:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("%i", atoi(" -123junk"));
printf("%i", atoi("0"));
printf("%i", atoi("junk")); // no conversion can be performed
printf("%i", atoi("2147483648")); // UB: out of range of int
}
Выход:
-123
0
0
-2147483648
Однако в моей программе я пытаюсь предоставить строку в качестве входных данных и получать цифры только в качестве выходных данных:
Код 2:
#include <stdio.h>
#include <stdlib.h>
int main() {
int c, i;
char s[i];
for (i = 0; (c = getchar()) != '\n'; ++i)
s[i] = c;
s[i] = '\n';
s[++i] = '\0';
printf("%i", atoi(s));
}
При выполнении на машине:
pi@host:~/new$ cc new.c
pi@host:~/new$ a.out
21412421How it is
0
Я получаю неверные значения в качестве вывода.
Вопросы:
1) В соответствии с кодом 1, printf("%i", atoi(" -123junk"))
, похоже, что функция atoi()
может принимать строку в качестве аргумента и возвращать одно целое число, представляющее конкатенацию числовых значений цифр во входной строке, не это?
2) Что возвращает atoi()
из stdlib.h
?
3) Как исправить функцию main()
из кода 2, чтобы получить символы из stdin
, записать в массив, вызвать функцию atoi()
, предоставить массив в качестве аргумента, получить буквально цифры на выходе?
4) Согласно примеру K & R функции atoi()
, «выражение (s[i] - '0')
- это числовое значение символа, хранящегося в s[i]
», но зачем нам нужно добавлять 10 * n
часть, более того? , чтобы присвоить n
0
перед ним, как n * 0 = 0
, следовательно, n * 10 = 0
, что означает, что n * 10
всегда будет нулем в операторе присваивания n = 10 * n + (s[i] - '0');
, следовательно, зачем нам это?
5) Если atoi () возвращает одно целое число, как результат printf("%i", atoi(" -123junk"));
может вернуть строку с числами -123
? Другими словами, правильно ли я понимаю: функция atoi()
вызывается внутри функции printf()
с аргументом " -123junk"
. Функция atoi()
возвращает целое число, ТОЛЬКО одно целое число, что-то вроде n = 10 * n + (s[i] - '0');
чем, как его можно развернуть в -123
??