Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Elena_Tu
1 / 1 / 2
Регистрация: 07.02.2011
Сообщений: 221
1

Чтение массива с использованием Strtok

30.10.2012, 23:32. Просмотров 686. Ответов 9
Метки нет (Все метки)

Добрый день, подскажите пожалуйста, где ошибка , я пытаюсь считать массив, задающийся с клавиатуры через пробелы
посчитать среднее и стандартное распределение
но постоянно выходит ошибка Segmentation fault (core dumped)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define   MAXSIZE    8
 
int main( )
{
        int i,n;
        char value [MAXSIZE];
        double deviation, sum, sumsqr, mean, variance, stddeviation;
        char *a;
        sum = sumsqr = n = 0 ;
 
        printf(" Enter 8 digits separated by blanks : ");
        a = strtok(value, " ");
        while(a != NULL){
                scanf("%f", &value[i]);
                sum += value[i];
                n += 1;
                a = strtok(NULL, " ");
        }
 
        mean = sum/(float)n;
 
        for (i = 1 ; i<= n; i++) {
                deviation = value[i] - mean;
                sumsqr += deviation * deviation;
        }
        variance = sumsqr/(double)n ;
        stddeviation = sqrt(variance) ;
        printf("\nNumber of items : %d\n",n);
        printf("Mean : %f\n", mean);
        printf("Standard deviation : %f\n", stddeviation);
 
        return 0;
}
пробовала,
C
1
double value [MAXSIZE];
при компиляции warning а при запуске та же ошбика Segmentation fault

Спасибо
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2012, 23:32
Ответы с готовыми решениями:

Strtok для двумерного массива строк: При первом же заходе в цикл, функция возвращает NULL
Суть вот в чем: нужно ввести массив строк, затем в каждой строчке выделить 5-ое...

Что такое p=strtok(str," "), p=strtok(0," ")?
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;locale&gt; int main() { ...

Работа с strtok
Написать программу с помощью strtok. Дан текст. Преобразуйте текст, удалив...

Неоднократное использование strtok
Доброго времени суток всем!! У меня собсна следующий вопрос: можно ли...

Реализация функции strtok
Вводятся две строки - параметры функции strtok (из &lt;string.h&gt;). Реализовать...

9
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
31.10.2012, 01:10 2
C++
1
2
3
4
5
6
        while(a != NULL){
                scanf("%f", &value[i]);
                sum += value[i];
                n += 1;
                a = strtok(NULL, " ");
        }
Переменная i не инициализирована! Могу предположить, что там должна быть переменная n? И еще в scanf вы выбираете аргумент типа float ("%f") в символьный тип
0
Elena_Tu
1 / 1 / 2
Регистрация: 07.02.2011
Сообщений: 221
31.10.2012, 01:15  [ТС] 3
да, это я исправила
дописала i++ в цикл и исправила f на d
но проблем осталась, т.к. Strtok раотает только с char

нужно как-то по другому считать, но я не знаю еще как
0
easybudda
Модератор
Эксперт CЭксперт С++
10108 / 6016 / 1508
Регистрация: 25.07.2009
Сообщений: 11,404
31.10.2012, 03:31 4
Elena_Tu, что-то у Вас, барышня, совсем не то написано. Мало того, что функция strtok для строк предназначена, а числа из них при таком подходе ещё получить нужно, так ещё и индексы в массиве с 0 начинаются, а не с 1. Вот Вам простенький пример чтения значений в массив и вывода среднего арифметического, остальное можно по образу и подобию сделать...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
#define NUM_ELEMENTS 8
 
int main(void) {
    double array[NUM_ELEMENTS], sum;
    int i;
    
    printf("Enter %d values\n", NUM_ELEMENTS);
    for ( i = 0; i < NUM_ELEMENTS; ++i ) {
        printf("Value #%d: ", i + 1);
        if ( scanf("%lf", &array[i]) != 1 ) {
            fprintf(stderr, "Input error!\n");
            return 1;
        }
    }
    
    sum = 0.0;
    for ( i = 0; i < NUM_ELEMENTS; ++i )
        sum += array[i];
    printf("Mean: %f\n", sum / NUM_ELEMENTS);
    
    return 0;
}
1
Elena_Tu
1 / 1 / 2
Регистрация: 07.02.2011
Сообщений: 221
31.10.2012, 05:15  [ТС] 5
Спасибо, программа ваша работает, но мне нужно именно вводить через пробелы, как подскажете это решить? спасибо!
0
easybudda
Модератор
Эксперт CЭксперт С++
10108 / 6016 / 1508
Регистрация: 25.07.2009
Сообщений: 11,404
31.10.2012, 10:52 6
Цитата Сообщение от Elena_Tu Посмотреть сообщение
Спасибо, программа ваша работает, но мне нужно именно вводить через пробелы, как подскажете это решить? спасибо!
11 строчку закомментируйте (это в которой запрос на ввод каждого числа) и вводите свои 8 чисел хоть через пробел, хоть через табуляцию...
1
Elena_Tu
1 / 1 / 2
Регистрация: 07.02.2011
Сообщений: 221
31.10.2012, 22:58  [ТС] 7
Спасибо, только вот проблема, что я не могу ввести меньше чем 8 чисел, подскажите пожалуйста! как это решить?
0
David Sylva
1294 / 956 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
01.11.2012, 12:46 8
#define NUM_ELEMENTS 8 здесь вот, поменяйте 8, на то число которое вам необходимо при вводе.
0
Elena_Tu
1 / 1 / 2
Регистрация: 07.02.2011
Сообщений: 221
01.11.2012, 19:29  [ТС] 9
это не подходит, тк. хотелось бы чтобы , например, если введешь 5 элементов (или любое другое кол-во меньшее 8)то бы все равботало без изменения ( а если введешь больше 8 то принимало только восемь)
0
easybudda
Модератор
Эксперт CЭксперт С++
10108 / 6016 / 1508
Регистрация: 25.07.2009
Сообщений: 11,404
02.11.2012, 16:19 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ну тогда, если не смущает, что можно вводить 3.14pi (прочтётся, как 3.14) и в случае, если чисел больше 8, посчитаются только 8, без сообщений о том, что ещё есть, то вот, как вариант:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>
 
#define MAX_ELEMENTS 8
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ], * ptr;
    double arr[MAX_ELEMENTS], sum;
    size_t count, i;
    
    while ( printf("Enter some values (%d max): ", MAX_ELEMENTS) && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        count = 0;
        for ( ptr = strtok(buf, DELIM); ptr != NULL && count < MAX_ELEMENTS; ptr = strtok(NULL, DELIM) ) {
            if ( sscanf(ptr, "%lf", &arr[count++]) != 1 ) {
                fprintf(stderr, "Wrong input!\n");
                return 1;
            }
        }
        
        sum = 0.0;
        for ( i = 0; i < count; ++i )
            sum += arr[i];
        printf("Mean: %f\n", sum / (double)count);
    }
    
    return 0;
}
0
02.11.2012, 16:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2012, 16:19

Написать свою strtok
Помогите пожалуйста, нужно написать свою функцию, чтоб работала как strtok...

Чтение символьного массива
Нужно написать программу &quot;кодовый замок&quot; : вводишь разные символьные данные...

Заменить функцию strtok на собственную
нужно заменить функцию strtok на собственную #include &lt;stdio.h&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru