Разделение всех символов в строке перед указателем strstr в C - PullRequest
1 голос
/ 01 марта 2020

Я создаю программу поиска и замены в C. он должен иметь возможность заменить все, что ищется в текстовом файле, чем-то другим.
Например. Поиск elo в input.txt заменить на ELO
Результат: разработчики devELOpers
например, поиск el заменить EL привет hELlo welcome wELcome

У меня возникли реальные проблемы с получением всех символов в строке перед указателем. Я могу получить отдельные слова и указатель для поискового слова, и я могу получить все после поискового запроса, но я не могу получить все до искомых символов. Пробовал strlen на всем слове и вычитал безрезультатно. Я также могу получить длину первой части нужного мне слова. Спасибо за любую помощь.

поиск эры в действии:

Выходы

firstMatch = erating

Конечная часть = ting

startLength 2

    #include <stdio.h>
#include<stdlib.h>
#include <string.h> 
#define LINE_LENGTH 1000


//Function to remove a newline character and replace it with a null terminator.
void remove_newline(char *str) 
{
    int len =strlen (str);

    if (len>0 &&str[len -1] == '\n')
    str[len -1] = '0';
}


int main(int argc, char **argv)
{
    char* searchWord = argv[1]; //Define the string searched for as argument  1.
    char* replaceWord = ""; // Initialise the word for replacing search word.
    char* text_File= ""; // Initialise the text file


    for(int i = 0; i < argc; i++)
    {
        if (strcmp(argv[i],"-r")==0)
        {

            replaceWord = argv[i+1]; // Identify the replacemnt word as the argument that comes after "-r".
        }

        if (strcmp(argv[i],"-i")==0)
        {
            text_File = argv[i+1]; // Identify the file word as the argument that comes after "-i".
        }


    }   

    char slen= strlen(searchWord);

    printf("You have searched for %s\n", searchWord); // Clarify for the user their search terms and input file.
    printf("In the file %s\n", text_File);


    FILE *input_file = fopen(text_File, "r"); // Open the text file
    char line [LINE_LENGTH];

    FILE *write_file = fopen("output.txt", "w"); //Create a new file for writing to.



`       while (fgets(line, LINE_LENGTH, input_file) != NULL)      ***// Loop through the contents of the input file.***
    {


    char *currentWord;     ***// Separate the words at any of "\n ,.-".***
    char *tempWord; 

    currentWord = strtok(line, "\n ,.-");
    while (currentWord != NULL)     ***// Loop through every seperated word.***
    {
        remove_newline(currentWord); //Remove the newline character form the current word.
        if (strstr(currentWord, searchWord)!= NULL)      ***// Check if the current word contains the searh word***
        {
            printf ("%s ", currentWord);      ***// If it does print to console the word containing it***

            char currLength= strlen(currentWord);
            printf("%d\n", currLength);
            char* firstMatch= strstr(currentWord, searchWord);      ***// Find the first occurence of the searched term***
            printf ("firstMatch %s\n ", firstMatch);      ***//Print evrything after and including search.***
            char* lastPart = firstMatch + slen;      ***// Get the part after the search***
            printf ("End part %s\n ", lastPart); 
            char rest = strlen(firstMatch);


            char startLength = currLength - rest;  

Здесь это не работает.

            char* startPart = firstMatch - startLength;
            printf ("start Part %s\n ", startPart);
            printf ("startLength %d\n\n ", startLength);`

1 Ответ

0 голосов
/ 02 марта 2020

Причиной неожиданного результата при попытке вывести часть слова «перед соответствием» является то, что в строке слова нет ничего, что могло бы вызвать остановку вызова

    printf("start Part %s\n ", startPart);

после него. напечатал первые startLength символов слова. Когда printf предписывается печатать строку, он печатает все символы с начальной точки, пока не встретит терминатор \0. Здесь только \0 находится в конце слова, поэтому printf печатает все слово.

Если вы хотите напечатать только первые несколько символов слова, вы должны либо создать \0 -конечная строка, содержащая только эти первые несколько символов, или вы должны распечатать их с помощью механизма, который не пытается рассматривать их как строку.

Для создания \0 -конечной строки запуска Вы можете временно перезаписать первый символ совпадения с помощью \0, затем вызвать printf, а затем восстановить символ совпадения. Что-то вроде:

    char savedFirstMatch = *firstMatch;
    *firstMatch = '\0';
    printf("start Part %s\n ", startPart);
    *firstMatch = savedFirstMatch;

Если вы не хотите этого делать, вы можете использовать for l oop, чтобы печатать только первые startLength символы как отдельные символы, а не как строку , перед которым следует printf или puts, который испускает любые дополнительные материалы, которые вы хотите напечатать вокруг этих символов. В этом случае дополнительный материал представляет собой строку «начало части» перед символами, а также новую строку и пробел после (при условии, что этот пробел не просто опечатка). Это будет выглядеть примерно так:

    puts("start Part ");
    unsigned startIndex;
    for (startIndex = 0; startIndex < startLength; ++startIndex) {
        putchar(startPart[startIndex]);
    }
    puts("\n ");

Конечно, если вам не нравятся puts и putchar, вы можете использовать printf("%s", ...) и printf("%c", ...) вместо этого.

...