Поиск ошибок в тексте (не срабатывает код) - C (СИ)
Формулировка задачи:
Помогите найти ошибку в коде (не срабатывает условие if(ptr[z-ptr-1]!='-') ). Задание звучит так: Найти в веденном тексте не правильное написание частиц "-то, -либо, -нибудь", т.е БЕЗ "-"
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <locale.h>
#include <ctype.h>
#include <string.h>
#include <windows.h>
using namespace std;
#define size 1024
int main(){
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
char* vse[]={"то","либо","нибудь"};
char buffer[size];
char symbol[size];
cout<<"Введите текст\n";
fgets( buffer, 1024, stdin );
//cout<<"Введите текст";
//gets( symbol);
char *ptr = strtok(buffer, " ,.");
size_t count=0;
char* z=NULL;
while(ptr!=NULL)
{ z=NULL;
int i;
for (i=0;i<3;i++)
{
z=NULL;
z=strstr(ptr,vse[i]);
if(z>ptr)
{
if(ptr[z-ptr-1]!='-')
size_t count=0;
++count;
}
}
ptr = strtok(NULL, " ,.");
}
cout<<"Ошибки встречаются: "<<count<<std::endl;
getch();
return 0;
}Решение задачи: «Поиск ошибок в тексте (не срабатывает код)»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <windows.h>
#define DELIM " ,.!?\n\t"
bool is_correct(const char* word)
{
static const char* PARTS[] = {"то", "либо", "нибудь", NULL};
if (strlen(word) < 3)
return true;
for (size_t i = 0; PARTS[i]; i++) {
char* ptr = strstr(word, PARTS[i]);
if ( ptr && !(*(ptr + strlen(PARTS[i]))) && (*(ptr-1) != '-'))
return false;
}
return true;
}
int main(void)
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
char buf[BUFSIZ];
while (printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf!='\n')
for (char* ptr = strtok(buf, DELIM); ptr; ptr=strtok(NULL, DELIM))
if (!is_correct(ptr)) puts(ptr);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с памятью, строками и консолью.
- Определяем разделитель для разделения входной строки на слова.
- Создаем функцию is_correct, которая проверяет корректность слова по заданным частям речи.
- В функции is_correct используется статический массив PARTS, который содержит возможные части речи.
- Если длина слова меньше 3 символов, функция возвращает true.
- В противном случае, происходит поиск каждого элемента массива PARTS в слове.
- Если элемент найден и после него есть символ, не являющийся пробелом или дефисом, функция возвращает false.
- В функции main устанавливаем кодировку консоли для работы с русским языком.
- Создаем буфер для чтения строки из консоли.
- В цикле запрашиваем строку у пользователя и проверяем каждое слово на корректность с помощью функции is_correct.
- Если слово некорректно, выводим его на экран.
- Цикл продолжается до тех пор, пока пользователь не введет пустую строку.
- В конце программы возвращаем 0, чтобы указать на успешное выполнение.