Удаление слова из строки: неправильный указатель - C (СИ)
Формулировка задачи:
Написать программу, которая:
- выводит текст на экран дисплея;
- выводит текст на экран дисплея еще раз, удаляя из него заданное слово (заданное слово вводится с клавиатуры).
В этом коде, насколько я поняла, есть проблема с указателем *p и функцией strstr(), и при запуске постоянно вылетают ошибки в output.c и strstr.asm вида:
Подскажите, пожалуйста, что не так.
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
int main ()
{
setlocale (LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE *text_file;
int i=0, j=0, x=0;
char *p;
const int SIZE = 15, MAX_SIZE = 70;
char **string = new char *[SIZE];
char word [MAX_SIZE];
for(i=0; i<SIZE; i++)
string[i] = new char[MAX_SIZE];
for (i=0; i<SIZE; i++)
for (j=0; j<MAX_SIZE; j++)
string[i][j]='\0';
if((text_file=fopen("file.txt","r")) == NULL )
{
printf ("\nFile does not exist.\n");
getch();
exit(1);
}
while ((!feof(text_file)) && (x<SIZE))
{
fgets (string[x], MAX_SIZE, text_file);
printf ("%s", string[x]);
x++;
}
/* выводит текст на экран дисплея еще раз, удаляя из него заданное слово
(заданное слово вводится с клавиатуры). */
fflush(stdin);
printf ("\n\nВведите слово: ");
scanf ("%s", word);
for (i=0; i<x; i++)
{
if (strstr(string[i],word)!=0)
//если введенное слово есть в строке, то далее эта строка разбивается на отдельные слова,
//которые по-одному сравниваются с введенным словом
{
p = strtok (string[i], " ");
while (p!=NULL)
{
p = strtok (NULL, " ");
if (strstr(p, word)!=0) printf ("%s",' ');
else printf ("%s ",p);
}
}
else printf ("%s",string[i]);
}
for(i=0; i<SIZE; i++)delete[] string[i];
delete[] string;
system("pause");
fclose(text_file);
return 0;
}
Необработанное исключение в "0x61f4984f (msvcr90d.dll)" в "14.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000020".
Решение задачи: «Удаление слова из строки: неправильный указатель»
textual
Листинг программы
while (p!=NULL)
{
if (strstr(p, word)!=0){
printf ("%c",' ');
}
else printf ("%s ",p);
p = strtok (NULL, " ");
}
Объяснение кода листинга программы
В данном коде происходит удаление слова из строки. Вот список действий:
- Входные данные:
- Строка: p (предположительно содержит несколько слов, разделенных пробелами)
- Слово: word (предположительно содержит одно слово, которое необходимо удалить)
- Создается цикл while, который выполняется до тех пор, пока p не станет равным NULL. Это означает, что мы проходим по каждому слову в строке.
- Внутри цикла проверяется, содержит ли текущее слово из строки p искомое слово word. Для этого используется функция strstr, которая возвращает указатель на первое вхождение подстроки в строку. Если подстрока найдена (strstr не возвращает NULL), то выполняется следующее действие:
- Выводится символ пробела: printf (
%c,' ');
- Выводится символ пробела: printf (
- Если подстрока не найдена, то выводится текущее слово из строки p: printf (
%s,p); - После вывода текущего слова, функция strtok вызывается с аргументами NULL и
, чтобы получить следующее слово в строке. Значение NULL указывает на то, что мы достигли конца строки, и следующий вызов strtok вернет NULL. - Цикл while продолжается, пока не будет достигнуто условие выхода из цикла (p не станет равным NULL). Таким образом, данный код проходит по каждому слову в строке и выводит все слова, кроме указанного для удаления.