Убрать пунктуацию с символов в C - PullRequest
0 голосов
/ 12 июня 2019

У меня есть текстовый файл с именем adc.txt, и я пытаюсь прочитать символы и удалить все знаки препинания внутри.

Файл adc.text:

*1. g7 h(8) zs89';
2. ;';fd(sa

фактический результат был:

ghzsfdsa

То, что я ожидал, было:

g7 h 8 zs89 fd sa

Любое предложение?

Вот мой код:

void chip_punct(char *ch){
    for(char *p = ch; *p; ++p)
        if(isalpha(*p))
            *ch++ = *p;
    *ch = '\0';
}

int main(void){
    FILE *fp;
    char ch[1024];
    size_t pos =0;

    fp = fopen("adc.txt", "r");
    if(fp != NULL){
        while(!feof(fp)){
            fgets(ch, sizeof(ch), fp);
            chip_punct(ch);
            printf("%s", ch);
        }
    }
    fclose(fp);
    return 0;
}

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Я обновил вашу функцию chip_punct, чтобы получить желаемый результат.

  1. Я звоню isalnum, чтобы проверить алфавитно-цифровые буквы и цифры.isalpha проверяет только буквы.
  2. Я использую флаг addSpace, чтобы запомнить, был ли последний символ буквенно-цифровым.Затем, перед добавлением символа, я проверяю, нужно ли добавлять пробел.
  3. Я помню первую позицию ch с ch0, чтобы избежать добавления пробела в начале.
void chip_punct(char *ch) {
    int addSpace = 0; // Flag if need to add space
    char *ch0 = ch; // Remember first position
    for (char *p = ch; *p; ++p)
    {
        if (isalnum(*p)) // Check if char is alphanumeric
        {
            if (addSpace && ch > ch0) // Check if need to add space
                *ch++ = ' ';
            *ch++ = *p;
            addSpace = 0;
        }
        else
            addSpace = 1;
    }
    *ch = '\0';
}

Вывод:

1 g7 h 8 zs892 fd sa

Отсутствие пробела между zs89 и 2 в следующей строке объясняется тем, что main печатает их без пробела.Вы можете изменить это, добавив пробел: printf("%s ", ch);

0 голосов
/ 12 июня 2019

Вы сдвигаете элементы влево, когда вы достигаете символа. Попробуйте заменить символы на ' '.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...