Поиск ошибок в тексте (не срабатывает код) - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с памятью, строками и консолью.
  2. Определяем разделитель для разделения входной строки на слова.
  3. Создаем функцию is_correct, которая проверяет корректность слова по заданным частям речи.
  4. В функции is_correct используется статический массив PARTS, который содержит возможные части речи.
  5. Если длина слова меньше 3 символов, функция возвращает true.
  6. В противном случае, происходит поиск каждого элемента массива PARTS в слове.
  7. Если элемент найден и после него есть символ, не являющийся пробелом или дефисом, функция возвращает false.
  8. В функции main устанавливаем кодировку консоли для работы с русским языком.
  9. Создаем буфер для чтения строки из консоли.
  10. В цикле запрашиваем строку у пользователя и проверяем каждое слово на корректность с помощью функции is_correct.
  11. Если слово некорректно, выводим его на экран.
  12. Цикл продолжается до тех пор, пока пользователь не введет пустую строку.
  13. В конце программы возвращаем 0, чтобы указать на успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5