У меня есть текстовый файл с именем 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;
}
Вы оставляете только те символы, для которых isalpha
возвращает значение true. Таким образом, он также удалит числа и пробелы.
Ах, я только что заметил... isalnum()
это то, что вам нужно. Но если вы хотите, чтобы последовательные небуквенные символы были заменены пробелом Один, вам понадобится другая переменная, чтобы отслеживать это.
Почему ожидаемый результат не включает 1
и 2
в начале каждой строки? Разве они не являются частью файла?
Ваш ожидаемый результат - вставка пробела для первого '(', но не для закрытия ')'?
@MichaelBianconi похоже, что пробел Один требуется для любого количества последовательных небуквенных символов. Перед 'f'
есть только один пробел.
Вы перемещаете элементы влево, когда достигаете символа. Попробуйте заменить символы на ' '
.
Замена символов пробелами не приведет к ожидаемому результату, представленному OP.
Я обновил вашу функцию chip_punct
, чтобы получить желаемый результат.
isalnum
, чтобы проверить буквенно-цифровые символы - буквы и цифры. isalpha
проверяет только буквы.addSpace
, чтобы запомнить, не был ли последний символ буквенно-цифровым. Затем, прежде чем добавить символ, я проверяю, нужно ли добавить пробел.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);
У вас может быть
else *ch++ = ' ';
Также смотрите Почемуwhile ( !feof (file) )
всегда неправильно?