Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Повторы слов


Автор: ineedhelpplease 12.12.2017, 22:35
"Дан текст, содержащий 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;
}



Автор: Romikgy 13.12.2017, 09:48
у вас все лексемы длинной менее 20 символов? 
(если 1000 лексема будет длинной более 20 букв , она налезет на массив б ...) 

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

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


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

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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)