Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторы слов 
:(
    Опции темы
ineedhelpplease
Дата 12.12.2017, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.12.2017

Репутация: нет
Всего: нет



"Дан текст, содержащий n строк. Для каждого из слов указать, сколько раз оно встречается в тексте."
Фишка в том, что происходит выход за пределы стека. Всплывает предупреждение:"Stack around the variable 'b' was corrupted".
Код

int main()

SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int i = 0, j = 0;
int n = 1;//изначальное количество лексем
char text[1000];
char *leks;//string или всё нормально?
char a[1000][20];//тут тоже не уверена
int b[1000];
bool bln;
gets_s(text);
for (i = 0; i < 1000; i++) b[i] = 0;
leks = strtok(text, " ,.?!");//находим первую лексему//текст - char
strcpy(a[i], leks);//заносим в массив лексему
b[i]++;//одна лексема есть, и ее кол-во = 1
strcpy(leks, strtok(NULL, " ,.-"));//переходим к новой лексеме
while (leks != NULL)//пока лексема существует
{
    bln = 0;
    for (i = 0; (i < n)&&(bln==0); i++)
    {
        if (strcmp(leks, a[i])==0) //если значение новой лексемы = значению i leks a[i]
        {
            b[i]++;//плюсуем в счётчик i-ой лексемы единицу
            bln = 1;//true
        }
    }
    if (bln = 0)//если не тру
    {
        strcpy(a[i + 1], leks);//создаем новую лексему в новом элементе массива
        n++;//теперь неповторяющихся лексем на одну больше
    }
leks= strtok(NULL, " ,.-");//переход к новой лексеме
}
//вывести на экран 2 соответсвующих массива
for (i = 0; i < n; i++)
{
    puts(a[i]);//printf("%c", a[i]);
    printf("%d", b[i]);
}
system("pause");
return 0;
}



PM MAIL   Вверх
Romikgy
Дата 13.12.2017, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



у вас все лексемы длинной менее 20 символов? 
(если 1000 лексема будет длинной более 20 букв , она налезет на массив б ...) 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romikgy
Дата 13.12.2017, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(ineedhelpplease @  12.12.2017,  21:35 Найти цитируемый пост)
strcpy(a[i + 1], leks);//создаем новую лексему в новом элементе массива

100 % уйдет за пределы массива
Цитата(ineedhelpplease @  12.12.2017,  21:35 Найти цитируемый пост)
char a[1000][20];




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Dov
Дата 24.12.2017, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Немного напильником пошоркал, вроде бы работает:
Код

int main()

    int    i            = 0,
           j            = 0;
    int    n            = 1;                        //изначальное количество лексем
    char   text[1000];
    char   delim[]      = " ,.-?!";
    char  *leks;                                    //string или всё нормально?
    char   a[20][1000];                             //тут тоже не уверена
    int    b[20]        = {0};
    bool   bln          = false;
    
    gets(text);
        
    leks = strtok(text, delim);                     //находим первую лексему//текст - char
    strcpy(a[0], leks);                             //заносим в массив лексему
    b[0]++;                                         //одна лексема есть, и ее кол-во = 1
    
    while ((leks = strtok(NULL, delim)) != NULL)    //пока лексема существует
    {
        for (i = 0; (i < n) && (bln == false); i++)
        {
           if(strcmp(leks, a[i]) == 0)              //если значение новой лексемы = значению i leks a[i]
            {
                b[i]++;                             //плюсуем в счётчик i-ой лексемы единицу
                bln = true;                         //true
            }
        }
        
        if(bln == false)
        {
            strcpy(a[n], leks);                     //создаем новую лексему в новом элементе массива
            b[n]++;
            n++;                                    //теперь неповторяющихся лексем на одну больше
        }
        else
            bln = false;
    }
    //вывести на экран 2 соответсвующих массива
    for (i = 0; i < n; i++)
        printf("%s - %d\n", a[i], b[i]);
   
    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1167 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.