Member 12537459 Ответов: 2

Может ли кто-нибудь найти ошибку в программе блокировки плохих слов?.


программа предназначена для чтения плохого слова и блокировки всех символов, кроме первого и последнего

Что я уже пробовал:

#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
int change(char , int);
void star(char ,int);
void main()
{
    int i,y,j,c,w;
    char str[100],word[1000];
    clrscr();
    cout<<" enter text"<<endl;
    gets(word);
    cout<<"The string before block"<<endl;
    puts(word);
    cout<<"The string after block";
    for(i=0;str[i]!='\0';++i)
    {
        if( word[i]!=' ')
        {
            str[j] = word[i];
            j++;
        }
        if(word[i]==' ')
        {
            y=strlen(str);
            w=change(str,c);
            if(w==1)
            {
                star(str,y);
                cout<<str<<" ";
                j=0;
            }
            if(w==0)
            {
                cout<<str<<" ";
                j=0;
            }
        }
    }
    getch();
}

int change(char str[],int c)
{

    if(str=='poop'||'balls')
        return 1;
    else return 0;
}
void star(char str[],int y)
{  
    int i;
    for(i=1;i<y-1;++i)>
    {
        str[i]="*";
     }
}

2 Ответов

Рейтинг:
5

Jochen Arndt

Есть еще ошибки помимо тех, которые упомянуты в решении 1:

for(i=0;str[i]!='\0';++i)

Здесь вы получаете доступ к str переменная без ее инициализации. Компилятор будет жаловаться на это при использовании высокого уровня предупреждения.
Вы, вероятно, хотите использовать word здесь вместо строки.

То же самое и для переменной j который никогда не инициализируется.

Правильный код:
int i,y,c,w;
int j = 0;
char str[100],word[1000];
str[0] = '\0';
// ...
for(i=0;word[i]!='\0';++i)



Следующая проблема в этой строке:
y=strlen(str);

То strlen функция требует, чтобы переданная строка завершалась NULL. Но ваша строка не заканчивается NULL. Вместо использования strlen вы можете сами подсчитать длину (при добавлении символов) или установить следующую величину в NULL:
{
    if( word[i]!=' ')
    {
        str[j] = word[i];
        j++;
        // Terminate string here or use j as count (current length)
        str[j] = '\0';
    }

Обратите внимание, что ваш change функция также подвержена влиянию (строка также должна быть завершена нулем для сравнения). Таким образом, обеспечение того, чтобы он всегда заканчивался NULL, было бы лучшим решением.


[no name]

ошибка: символьная константа должна быть длиной в один или два символа

[no name]

должен ли я использовать

int change(char *, int);
void star(char *, int);
как прототипы? // компилятор заставляет меня делать то же самое, но я не могу догадаться, почему?

2) Если(чего strcmp(STR, на "покакать") == 0 ||strcmp стандарта(стр, "шарики") == 0)
это было рекомендовано.. но должен ли я заключать шары или какашки в одинарные или двойные кавычки?

3) ошибка возникает, когда str[i]="*"; Почему?

Jochen Arndt

Одинарная кавычка для одиночных символов и двойные кавычки для строк (список символов с завершающим нулевым байтом).

Это ответы 2. и 3. (что является ошибкой, которую я наблюдал).

До 1:
Еще одна ошибка о наблюдал. Объявление в верхней части файла использует char, в то время как более поздняя реализация использует char[]. Вы должны использовать одно и то же в обоих местах. В вашем случае это char* или char[].

char - это один символ, в то время как char* - это указатель на один или несколько символов, таких как char[] (массив символов, фактически такой же, как char*).

Строка - это список символов (char*), конец которого обозначается нулевым байтом.

[no name]

1) ошибка: символьная константа должна быть длиной в один или два символа
2)я не могу назначить str[i] ="*";

новый кодекс

int change(char[]);
void star(char [], int);
пустота главная()
{
int i, y, j=0, w;
char str[100], word[1000];
str[0]= '\0';
clrscr();
cout<< "введите текст" < & lt;endl;
получает (слово);
cout<< "строка перед блоком" < & lt;endl;
ставит (слово);
cout<< " строка после блока";
for (i=0; word[i]!= '\0';++i)
{
если (слово[i]!=' ')
{
str[j] = слово[i];
Дж++;
str[j]= '\0';
}
если (слово[i]==' ')
{
w=изменение(str);
если (w==1)
{
звезда (str, j);
cout< & lt; str<<" ";
j=0;
}
если (w= = 0)
{
cout< & lt; str<<" ";
j=0;
}
}
}
геч();
}

интервал изменения(ул. гольца [])
{

if (strcmp(str,'poop'==0)| / strcmp(str, 'bad'==0))
возврат 1;
else return 0;
}
void star(char str [], int y)
{ int i;
Для(я=1;я&Л;Г-1;++я) {="" стр[я]="0;" }="" &усилитель;усилитель; nbsp;="" &ЛТ;="" деление=""&ГТ; &ЛТ;див ИД="EditDialogPlaceholder"&ГТ;&ЛТ;/дел&ГТ; &ЛТ;див ИД="ReplyDialogPlaceholder"&ГТ;&ЛТ;/дел&ГТ;

Jochen Arndt

str[i] обращается к символу
"*"- это строка
Так и должно быть:
str[i] = '*';

Также как уже отметил Грифф:
если(0 == strcmp стандарта(стр,"какашки") || 0 == strcmp стандарта(стр,"плохо"0))

В приведенном выше примере вы должны использовать строки. Обратите внимание также, что ваши условия (по сравнению с нулем) поставлены неправильно.

Рейтинг:
2

OriginalGriff

ГМ...начните с того, что посмотрите на свой код: если он скомпилирован (чего он не будет) Я вижу одну проблему даже не запустив ее:

if(str=='poop'||'balls')

Это не то, что вы думаете: это два отдельных теста.
Первый тест-это str=='poop' и если это ложь он выполняет второй тест: 'balls' Обратите внимание, что во втором тесте не упоминается str переменная вообще: если просто смотрит на строку и решает, является ли она нулевой или ненулевой. Поскольку это постоянная строка, она никогда не будет равна нулю, поэтому всегда будет приниматься как true
Это было бы, если бы состояние всегда проходило. Исправляя кавычки, чтобы он компилировался, и исправляя это:
if(str == "poop"||str == "balls")
будет делать то, что вы хотите, но даже тогда это не сработает, потому что == в этом случае сравнивает значения указателей, а не последовательности символов, на которые они указывают.
Чтобы использовать массивы char, вам нужно будет использовать strcmp:
if(strcmp(str, "poop") == 0 ||strcmp(str, "balls") == 0)