Не работает функция в программе, похоже ошибка где-то с указателями или с типами переменных - C (СИ)

Узнай цену своей работы

Формулировка задачи:

суть программы, вводится строка, с клавиатуры задается число, если есть слова в строке, в которых есть заданное число случайных цифр, то эти слова нужно удалить...
#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
char* word_kick(char*S, int KOL)
{
    int kol=0;
    char*beg, *end, *j;
        while(*S!='\0')
        {
            while(*S==' '||*S=='\t'||*S=='\n')
                S++;
            if(*S!='\0')
            {
                beg=S;
                while(*S!='\0'&&*S!='\t'&&*S!='\n'&&*S!=' ')
                    S++;
                end=(S-1);
            }
            for(j=beg; j<=end; j++)
                if('0'<=*j&&*j<='9')
                kol++;
            if(kol==KOL)
            {
                j=end+1;
                for(S=beg; *S!='\0'; S++)
                {
                    S=j;
                    j++;
                }}}
return S;}

int _tmain(int argc, _TCHAR* argv[])
{ char S[100]; char* t=S;
int n;
cout<<"vvedite stroku"<<endl;
cin.getline(S,100);
cout<<"vvedite kol-vo simvolov"<<endl;
cin>>n;
t=word_kick(S,n);
cout<<t;
getchar();
getchar ();
 
    return 0;
}

Решение задачи: «Не работает функция в программе, похоже ошибка где-то с указателями или с типами переменных»

textual
Листинг программы
#include <iostream>
using namespace std;
char* word_kick(char*S, int KOL)
{
    int kol=0;
    char*beg, *end, *j,*S0,*S1;
    S0=S; // запомним начало строки
    while(*S!='\0')
    {
        while(*S==' '||*S=='\t'||*S=='\n')
            S++;
        if(*S!='\0')
        {
            beg=S;
            while(*S!='\0'&&*S!='\t'&&*S!='\n'&&*S!=' ')
                S++;
            end=(S-1);
        }
        kol=0;  // Не забываем обнулять счетчик
        for(j=beg; j<=end; j++)
            if('0'<=*j&&*j<='9')
                kol++;
        if(kol==KOL)
        {
            j=end+1;
 
            for(S1=beg; *j!='\0'; S1++)// нужна другая переменная
            {
                *S1 = *j;
                j++;
            }
            *S1='\0'; // Конец строки тоже надо перенести
            S=beg+1; // Передвигаем указатель на новое положение слова
        }
    }
    return S0;// Возвратить надо всю строку
}
int main()
{ 
    char S[100]; char* t=S;
    int n;
    cout<<"vvedite stroku"<<endl;
    cin.getline(S,100);
    cout<<"vvedite kol-vo simvolov"<<endl;
    cin>>n;
    t=word_kick(S,n);
    cout<<t;
    system("pause");
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с потоками ввода-вывода и строками.
  2. Объявляем функцию word_kick, которая принимает два аргумента: строку S и число KOL.
  3. Внутри функции объявляем переменные: kol (счетчик), beg, end, j, S0, S1.
  4. Запоминаем начало строки (S0).
  5. В цикле while считываем строку до символа '\0'.
  6. Внутри цикла while проверяем символы на равенство пробелу, табуляции, переносу строки и цифрам.
  7. Если символ не является концом строки, то считываем данные в переменные beg и end.
  8. Переменная kol обнуляется.
  9. В цикле for проходим по символам от beg до end и увеличиваем счетчик kol, если символ является цифрой.
  10. Если kol равно KOL, то переносим символы из j в S1 и добавляем '\0' в конец строки.
  11. Перемещаем указатель S на новое положение слова.
  12. Возвращаем S0.
  13. В функции main считываем строку и количество слов в нее.
  14. Вызываем функцию word_kick и сохраняем результат в переменную t.
  15. Выводим значение t.
  16. Ждем нажатия клавиши для завершения работы программы.
  17. Возвращаем 0, что означает успешное завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5
Похожие ответы