У меня есть строка, и я хочу удалить любые -, (,), &, $, #,! , [,], {,}, ", 'с начала или конца слова - PullRequest
1 голос
/ 20 марта 2020

Каждое слово является строкой, между ними нет пробелов, поскольку каждое слово читается с использованием scanf.

Если оно находится между словами, просто игнорируйте их.

Например:

"..!Hello!!!."

будет производить

Hello

, а

"??Str'ing!!"

будет производить

   Str'ing

Так как я новичок, я разрешено использовать только циклы и стандартный заголовок <string.h> в C.

. Я уже создал вспомогательную функцию, которая продолжает чтение каждого индекса и возвращает true, если символ соответствует любому из перечисленных выше.

Пока у меня есть это, но оно удаляет пунктуацию из всего кода, а не только начало и конец слов:

void punc(char *str) {
    char *pr = str;
    char *pw = str;
    while (*pr) {
        *pw = *pr++;
         pw += (is_punc(*pw) == false);
    }
    *pw = '\0';
}

1 Ответ

1 голос
/ 20 марта 2020

Хороший способ сделать это - сбрить все знаки препинания спереди и сзади массива символов, для этого примера я использую ваши указатели, перемещая их вдоль массива символов до первого символа без знаков препинания найден, завершается нулем и возвращает указатель на 1-й символ пунктуации:

Живой образец

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *punc(char *str)
{
    int iterations = 0;
    char *pr = str;                   
    char *pw = &str[strlen(str) - 1]; //pointer to str end
    while (ispunct(*pr))  // I'm using ctype.h ispunct() standard function here 
    {                     // You can repalce it by your helper function    
        pr++;
        printf("it%d ", iterations++); //count and print iterations
    }
    while (ispunct(*pw))
    {      
        if(pw <= pr){  //using pointer comparison to avoid unnecessary iterations
           break;
        }
        pw--;
        printf("it%d ", iterations++);  //count and print iterations
    }   
    *(pw + 1) = '\0';
    return pr;
}

int main()
{
    char str1[] = ".[],!hello-.,?!-worl.d.?(!.";  //test1
    char str2[] = "!.';?";                        //test2   
    char *result1, *result2; 

    result1 = punc(str1);
    printf("  %s\n", result1);    
    result2 = punc(str2);
    printf("  %s\n", result2);    
    strcpy(str1, result1);  //if you want to really replace str with new string   
    return 0;
}

Вывод:

it0 it1 it2 it3 it4 it5 it6 it7 it8 it9   hello-.,?!-worl.d
it0 it1 it2 it3 it4
...