Не работает функция в программе, похоже ошибка где-то с указателями или с типами переменных - 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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с потоками ввода-вывода и строками.
- Объявляем функцию word_kick, которая принимает два аргумента: строку S и число KOL.
- Внутри функции объявляем переменные: kol (счетчик), beg, end, j, S0, S1.
- Запоминаем начало строки (S0).
- В цикле while считываем строку до символа '\0'.
- Внутри цикла while проверяем символы на равенство пробелу, табуляции, переносу строки и цифрам.
- Если символ не является концом строки, то считываем данные в переменные beg и end.
- Переменная kol обнуляется.
- В цикле for проходим по символам от beg до end и увеличиваем счетчик kol, если символ является цифрой.
- Если kol равно KOL, то переносим символы из j в S1 и добавляем '\0' в конец строки.
- Перемещаем указатель S на новое положение слова.
- Возвращаем S0.
- В функции main считываем строку и количество слов в нее.
- Вызываем функцию word_kick и сохраняем результат в переменную t.
- Выводим значение t.
- Ждем нажатия клавиши для завершения работы программы.
- Возвращаем 0, что означает успешное завершение работы программы.