Нахождение суммы целых в строке - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно вывести сумму чисел, которые находятся внутри предложения.Например:

  • ввод: abc3x casa2 y34zq
  • вывод: 3 + 2 + 3 + 4 = 12

Мне нужно прочитать все предложениявключить пробел, чтобы сделать это, но мой цикл с getchar не работает.Может помочь мне найти проблему?

int main() {

    int i = 0;
    int somma = 0;
    char s[MAX];

    printf("inserisci la stringa : ");
    scanf("%s",s);

        while((s[i] = getchar()) != '\n'){
            i++;
            if(s[i]>'0' && s[i]<'9'){
            somma+= (int)s[i]-(int)'0';
        }
    }
    printf("la somma è = %d", somma);
}

Мне не нужно использовать getchar.Я бы предпочел использовать fgets, потому что я знаю, что fgets может прочитать всю строку, включая пробел.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Поскольку вы можете использовать fgets(), вы можете прочитать всю строку, а затем использовать isdigit(), чтобы найти числа.

FILE *fp;
fp = fopen("file.txt" , "r");
if(fp == NULL) {
  perror("Error opening file");
  return(-1);
}

char line[MAX];
if( fgets(line, MAX, fp) == NULL ) { // Read entire line
    perror("Error reading file");
    return -1;
}

int sum = 0;

int len = strlen(line);
for (int i = 0; i < len; i++) {
    if (isdigit( (unsigned char)line[i] )) { // cast handles negative values of line[i]
        sum += line[i] - '0'; // Add integer value to sum
    }
}

Основная идея та же, только она зацикливается на строке напрямую, вместо того, чтобы пытаться прочитать ее с getchar() на каждом шаге.

0 голосов
/ 15 мая 2018

Существует два способа решения вашей проблемы.

  1. Получить всю строку за один раз от пользователя

Чтобы прочитать всю строку, выможете использовать scanf, как вы его используете.Он будет хранить всю строку в массиве (s в вашем случае), а затем вы сможете анализировать этот массив и выполнять операции peform, как вы это делаете.Здесь ограничение будет длина строки.Вы можете принять строку размером MAX только потому, что ваш массив такого размера.Если вы согласны с этим, тогда ваш код веренВсе, что вам нужно сделать, это удалить getChar() из while.

Чтение одного символа за раз .

Кроме того, вы можете прочитать один символ за раз от пользователя и немедленно выполнить операции над этим символом.В этом случае вам не нужно объявлять массив.Достаточно одной символьной переменной, и вы можете продолжать принимать данные от пользователя.В этом случае откажитесь от scanf() и в вашем while(), примите вывод getChar() в одном символе и выполните вашу операцию.

PS В вашем while () есть одна маленькая ошибка, которая выдаст вас невернорезультат в нескольких случаях.

...