Это не оптимальное решение. Это мое решение с учетом многочисленных ограничений, поэтому, если у вас были ограниченные ресурсы в соответствии с рекомендациями вашего курса / инструктора, это может подойти вам.
Также обратите внимание, что это часть моего собственного проекта, и мне пришлось читать операнды и цифры, поэтому я использовал getchars. В противном случае, если вам нужны только целые числа и никаких других символов, мне нравится использовать это:
int k;
while (scanf("%d", &k) == 1)
Правила не были конкретными, «продвинутыми» концепциями C: без строковых переменных, без структур, без указателей, без методов, не охваченных, и единственное включение, которое нам было разрешено, было # include
Так что без простых вызовов методов, таких как atoi () или каких-либо строковых переменных, я выбрал просто грубую силу.
1: читать символы в getchar (fgets был забанен). вернуть 1 (выход из состояния 1), если
есть недопустимый символ Для вашей проблемы на основе parseInt в Java
1 11 13 допустимо, но 1 11 1a недопустимо, поэтому для всех значений у нас есть допустимая «строка», если все символы 0-9 игнорируют пробел.
2: преобразовать значение ASCII символа в его целочисленное значение (например, 48 => 0)
3: использовать переменную val для хранения int таким образом, чтобы для каждого символа в подстроке была соответствующая целая цифра. то есть "1234" => 1234 добавить это к массиву int и установить val в 0 для повторного использования.
Следующий код демонстрирует этот алгоритм:
int main() {
int i, c;
int size = 0;
int arr[10]; //max number of ints yours may differ
int val = 0;
int chars[1200]; //arbitrary size to fit largest "String"
int len = 0;
//Part 1: read in valid integer chars from stdin
while((c = getchar()) != EOF && (c < 58 && c > 47)) {
chars[len] = c;
len++;
}
//Part 2: Convert atoi manually. concat digits of multi digit integers and
// append to an int[]
for(i = 0; i < len; i++){
for(i = 0; i < len; i++){
if(chars[i] > 47 && chars[i] < 58){
while((chars[i] > 47 && chars[i] < 58)){
if(chars[i] == 48)
c = 0;
if(chars[i] == 49)
c = 1;
if(chars[i] == 50)
c = 2;
if(chars[i] == 51)
c = 3;
if(chars[i] == 52)
c = 4;
if(chars[i] == 53)
c = 5;
if(chars[i] == 54)
c = 6;
if(chars[i] == 55)
c = 7;
if(chars[i] ==56)
c = 8;
if(chars[i] == 57)
c = 9;
val = val*10 + c;
i++;
}
arr[size] = val;
size++;
if(size > 10) //we have a check to ensure size stays in bounds
return 1;
val = 0;
}
//Print: We'll make it a clean, organized "toString" representation
printf("[");
for(i = 0; i < size-1; i++){
printf("%d, ", arr[i]);
}
printf("%d]", arr[i];
return 0;
Опять же, это метод грубой силы, но в таких случаях, как мой, когда вы не можете использовать концепции методов, которые люди используют профессионально, или различные инструменты C99, это может быть то, что вы ищете.