2015-03-24 6 views
-3

Для моей первой задачи я использую fgets() для чтения строки из stdin. Поэтому я вводил 1234567890 на терминал, и он сохраняет строку в переменной с именем str. Теперь я хочу разбить цифры и выполнить добавление. В этом случае сумма будет 55 с 1+2+3+4+5+6+7+8+9+0 = 55.Разбиение строки на целые числа

Как я могу это сделать?

Мой код до сих пор

#include <stdio.h> 
#include <string.h> 
int main(void){ 

char str[100]; 

printf("Please enter the 10 digit number \n"); 
fgets(str, 10, stdin); 

//Separate the digits 


//calculate their sum 
int sum =.............. 

//print out the sum 
printf("the sum of the digits is: %s", sum); 

return(0); 
} 
+0

Инициализировать 'сумму' var до 0. Итерировать строку до конца. Преобразуйте каждый символ ASCII в int. Добавьте его в «сумму» var. –

ответ

0

Поскольку вы уверены, что строка будет содержать цифры, вычтите каждый символ из '0', чтобы получить их числовое значение.

int sum = 0; 
fgets(str, sizeof str, stdin); 
char *s = &str; 
while(*s != '\0') { 
    sum += *(s++) - '0'; 
} 

printf("the sum of the digits is: %d", sum); 
5

Подход 1:

Если вы точно знаете, что вы рассчитываете на одной цифры целого числа, вы можете использовать

  • индексирование массива для считывания значения по значению из входной строки.
  • преобразовать значение char в соответствующее значение int согласно необходимой кодировке (в основном, ASCII).
  • определяют один int переменную, скажем res, чтобы держать сумму. выполнить сложение и сохранить результат до sum.
  • контур до завершения не достигнув.
  • распечатать sum используя %d спецификатор формата.

подход 2:

В качестве альтернативы, вы можете сделать что-то подобное (снова предполагая, одной цифры целого)

  • Преобразование всего строку в целое, используя strtol(). Вы должны проверить ошибки в этом случае.
  • определяют один int переменную, скажем res, чтобы держать сумму.
  • выполняют по модулю 10 (res`
  • делят преобразованное значение interger по 10 (p /= 10).
  • перейти к шагу 2 до тех пор пока результат 0.
  • , когда преобразованное значение interger становится 0, печать res.

P.S - Just FYI, обычный способ разделение строка на основе некоторого разделителя заключается в использовании strtok().

0

Во-первых, убедитесь, что вы читаете только цифры, используя scanf, например:

char str[11]; // 10 digits plus \0 terminator 
printf("Please enter the 10 digit number \n"); 
scanf("%10[0-9]", str); 

Теперь вы можете пройти через цифры один за другим путем индексации в str и вычитая код цифры ноль , как это:

int nextDigit = str[i] - '0'; 

Это должно быть достаточно информации для вас, чтобы завершить решение, добавив for петлю вокруг него. Убедитесь, что вы печатаете sum, используя %d, а не %s, как вы делали в своем примере кода.

+1

Я не думаю, что мы должны приводить людей в заблуждение в плохую практику программирования, предлагая им предпочесть scanf вместо fgets. – Lundin

+0

@ Lundin В этой конкретной ситуации 'scanf' обеспечивает превосходную альтернативу' fscanf' в каждом единственном уважении, которое вы могли бы назвать, оставаясь в равной степени безопасным. Конечно, он предоставляет больше мест для злоупотреблений, но он имеет совершенно безопасное использование, которое должен изучить каждый практик. – dasblinkenlight

Смежные вопросы