Удаление слова из строки: неправильный указатель - 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 и
- Цикл while продолжается, пока не будет достигнуто условие выхода из цикла (p не станет равным NULL). Таким образом, данный код проходит по каждому слову в строке и выводит все слова, кроме указанного для удаления.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д