Удалить пробелы из массива fgets - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь создать программу, вычисляющую среднее число целых чисел в заданной строке, которая добавляет их, пока не встретит -1, пример ввода 1 2 3 4 5 -1.

Как мне удалить пробелы из массива, чтобы мои вычисления сумм работали?

#include <stdio.h>
#include <stdlib.h>
#include "source.h"
#include <string.h>
#include <ctype.h>

#define MAX_LEN 1000

void calculate_average() {
    int test, size, sum, i, j, k, temp;
    int grade;
    char input[MAX_LEN];
    char formattedInput[MAX_LEN];
    double avg;
    size = 0;
    avg = 0.0;
    test = 1;
    k = 0;
    sum = 0;

    fgets(input, 10, stdin);
    for (j = 0; j < strlen(input); ++j) {
        if (input[j] = ' ') {
            ;
        } else {
            temp = input[j];
            formattedInput[k] = temp;
            ++k;
        }
    }

    for (i = 0; atoi(input[i]) != -1; ++i) {
        if (atoi(formattedInput[i]) == -1) {
            test = -1;
            avg = sum / size;
        } else {
            ++size;
            sum = sum + atoi(formattedInput[i]);
        }
    }

    printf("%f\n", avg);
}

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Я рекомендую использовать strtod, чтобы вы могли обрабатывать введенную строку без предварительной обработки,
В качестве примечания в исходном коде sum / size приведёт к int, и вы потеряете точность,поэтому вам нужно сначала выполнить приведение
Я изменил вашу функцию следующим образом

#define MAX_LEN 1000

void calculate_average(){
    int sum = 0;
    int count = 0;
    char input[MAX_LEN];

    fgets(input, 10, stdin);

    char *start, *end;
    start = input;
    while(1){
        int temp = strtod(start, &end);
        if(temp == -1)
           break;
        if(*end == 0)
            break;
        start = end;
        sum += temp;
        count++;
    }

    double avg = (double)sum / count;
    printf("%f\n", avg);
}
0 голосов
/ 20 января 2019

Вы можете использовать sscanf вместе со спецификатором формата %n для чтения чисел, разделенных пробелами.

Пример:

int temp = 0;
int bytesread = 0;
char *ptr = input;
while (sscanf(ptr, "%d%n", &temp, &bytesread) > 0 && temp != -1) {
   ptr += bytesread;
   sum = sum + temp;
}

Где %n будет возвращать количество байтов, прочитанных из строки, поэтому используйте это значение для перемещения ptr для указания следующего номера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...