Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
McSimov
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 17
#1

Не получается считать строку с gets - C++

03.11.2013, 22:31. Просмотров 362. Ответов 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "string.h"
#include "stdafx.h"
#include <iostream>
 
 
struct word  //пользовательский тип с атрибутами слова в строке - координаты начала и конца и длина
{
    int b,e,l;
};
 
float dist(float a[],int i,int r) //функция вычисления расстояния
{
    float dst=0;
       
    int end=r;
    
    for(int j=0;j<end ;j++)
        dst+=fabs(a[i]-a[j]);
    return dst;
}
 
 
int main() 
{
    
    float* a;    //объявление указателя на float
    int n;       //его размер
    float minr=0;  //минимум расстояния
    int minc=0;    //индекс самого близкого к соседям элемента
 
    char st[359];   //исходная строка
    int k=1;        //число слов в строке,изначально с учетом последнего слова
    int* wrds;      //указатель на int
    word* arw;      //указатель на пользовательский тип
//Задание 1. Поиск элемента с наименьшим расстоянием до других
    printf("Enter number of array elms: ");  //приглашение на ввод количества элементов массива
    scanf_s("%d",  &n);
    printf("\n");                            //считывание с клавиатуры количества элементов
    a = new float[n];                        //динамическое выделение  памяти для массива n элементов
    printf("Fill your array\n");             //заполнение массива
    for(int i=0;i<n;i++)
        scanf_s("%f", &a[i]);
 
    int p=0;
    for(int i=0;i<n;i++)
        if(dist(a,i,n)<dist(a,p,n))
        {
            minr=dist(a,i,n);
            minc=i;
            p=i;
        }
 
    printf("The element # %d has the least distance. The distance is %5.2f\n", minc, minr);
    delete[] a;  //удаление массива
    
//Задание 2. Вывод слов строки по увеличению количества букв
    printf("Enter your string: ");             //приглашение на ввод строки  
    gets_s(st);                                 //считывание с клавиатуры строки
    printf("\n");                                                  
    printf("String %s\n ",st);
    
    while(strlen(st)>200)                      //защита от дураков
    {
        printf(" You have broken my program \n that was awfully nice of you,try again \n");
        gets_s(st);
    }
                                        
    for(unsigned int i=0;i<strlen(st);i++)       //узнаем число слов
    {
        if (st[i]==' ') k++;
    }
    printf("Words %d\n",k);
    wrds = new int[k-1];    //выделяем память под массив
                            //формируем массив, элементы которого - координаты пробелов
    int j=0;
    while(j<k-1)
    {
        for(unsigned int i=0;i<strlen(st);i++)
            if (st[i]==' ')
            {
                wrds[j]=i;
                j++;        
            }
    }
    arw = new word[k];    //массив структур с атрибутами слов
 
    arw[0].b=0;           //заполняем  массив, 1й и последний элементы отдельно, остальные в цикле
    arw[0].e=wrds[0]-1;
    arw[0].l=wrds[0];
 
    arw[k-1].b=wrds[k-2]+1;
    arw[k-1].e=strlen(st);
    arw[k-1].l=strlen(st)-wrds[k-2]-1;
 
    j=0;
    for(int i=1;i<k-1;i++)
    {
        arw[i].b=wrds[j]+1;
        arw[i].e=wrds[j+1]-1;
        arw[i].l=arw[i].e-arw[i].b;
        j++;
    }
    
 
    word buf={0,0,0};      //сортируем массив по убыванию длины слова
    for(int i=0;i<k;i++)
            for( int j=0;j<k;j++)
                if(arw[i].l>arw[j].l)
                {
                    buf.b=arw[i].b;
                    buf.e=arw[i].e;
                    buf.l=arw[i].l;
 
                    arw[i].b=arw[j].b;
                    arw[i].e=arw[j].e;
                    arw[i].l=arw[j].l;
 
                    arw[j].b=buf.b;
                    arw[j].e=buf.e;
                    arw[j].l=buf.l;
                }
 
    printf("Words sorted by decreasing order: \n");  //вывод слов строки по убыванию длины
    for(int i=0;i<k;i++)
    {
        for(int j=arw[i].b;j<=arw[i].e;j++)
            printf("%c", st[j]);
        printf("\n");
    }
 
    delete[] wrds;
    delete[] arw;
    return 0;
 
}
Однако возникает проблема: не работает вторая ее часть, как исполнение доходит до gets, строка не считывается и даже не позволяется ее ввести. Если закомментить первую часть, то часть вторая работает верно. Даже и не знаю, в чем тут дело. Может быть что-то неправильное я творю с динамической памятью в первой части, а может не знаю каких-то нюансов работы с gets. Помогите, пожалуйста, разобраться в чем же дело.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 22:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается считать строку с gets (C++):

Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а - C++
Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а, необходимо для интерактивного ввода в...

Не получается считать из файла информацию - C++
У меня есть текстовый файл. Мне нужно считать в нем строчки, такого типа: qwert 12345 asdfghjk 213213 tgyhh 39482 Имена...

getline() (не получается считать информацию с файла) - C++
Здравствуйте. У меня есть файл вида: volleyball 1 sports.ru 500 volleyball football Первая строка - искомый тег, вторая -...

Не получается считать информацию из файла в 2-х мерный массив (С++) - C++
Что-то не совсем праильно работает, да и подскажите как потом поменять местами столбики со строками соответственно (т.е. 1-я строка...

Не получается считать значение параметров из командной строки - C++
Нужно cоставить программу , которая выводит на экран значение функции F(x) в заданном диапазоне .Диапазон и шаг изменения аргумента...

Не получается после первой итерации считать во вложенном (ss>>ch) - C++
Код вычисляет (вернее должен ) сумму чисел в числе,затем считывает обратно в поток stringstream и делает то же снова пока сумма не будет...

1
Insane__
43 / 43 / 4
Регистрация: 10.09.2013
Сообщений: 293
03.11.2013, 22:35 #2
Попробуй перед gets написать cin.sync();
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 22:35
Привет! Вот еще темы с ответами:

Не получается считать информацию из фаила (описать структуру с именем MARSH) - C++
Не получается считать информацию из файла. Все остальные действия программы кроме считывания информации из файла работают нормально. ...

Почему с помощью std::cin не получается считать с клавиатуры массив пользовательского типа? - C++
Доброго времени суток! Нашёл приме объвления класса комп. чисел и выполнения основных операций. Я пытал преобразовать коод таким образом,...

Считать строку из файла - C++
Как считать вторую строку из файла до пробела в элемент N, а после пробела в элемент K Пример файла: 01110 23 99 1...

Как считать строку? - C++
Зачем надо при считывания переменной типа string надо писать getline(cin, ...)? Зачем там cin? Разве там ожет быть что либо иное?


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

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

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