Удаление пунктуации в строке в C - PullRequest
1 голос
/ 15 февраля 2012

Я работаю над удалением знаков препинания, которые могут существовать как в начале, так и в конце строки или могут быть обоими.ех."!! Hello **" Я хочу вывод: "Hello" со всеми пунктуациями удален.

char s[] = "!!Hello**";
ch [] = NULL;
int i = 0;

for (i = 0; i < length; i++) {
    if ( isalpha(s[i]) ) {
        ch[i]=s[i];
    } else {
        continue;
    }
    ch[i] = '\0';
}

Блок кода, похоже, не копирует строки в ch.Понятия не имею почему !!

Ответы [ 4 ]

3 голосов
/ 15 февраля 2012

Вы можете изменить его на месте:

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

int main() {
  char s[] = "!!Hello**";
  size_t pos = 0;
  for (char *p = s; *p; ++p)
    if (isalpha(*p))
      s[pos++] = *p;
  s[pos] = '\0';
  printf("'%s'\n", s);
}

выход

'Hello'

Или используя только указатели:

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

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

int main() {
  char s[] = "!!Hello**";
  filter_alpha(s);
  printf("'%s'\n", s);
}

Чтобы удалить только начальные / конечные не-буквенные символы

#include <assert.h>
#include <ctype.h>  // isalpha()
#include <stdio.h>
#include <string.h> // strlen()

char* strip_nonalpha_inplace(char *s) {
  for ( ; *s && !isalpha(*s); ++s)
    ; // skip leading non-alpha chars
  if (*s == '\0')
    return s; // there are no alpha characters

  assert(isalpha(*s));
  char *tail = s + strlen(s);
  for ( ; !isalpha(*tail); --tail)
    ; // skip trailing non-alpha chars
  assert(isalpha(*tail));
  *++tail = '\0'; // truncate after the last alpha

  return s;
}

int main() {
  char s[] = "!!Hello**";
  printf("'%s'\n", strip_nonalpha_inplace(s));
}
1 голос
/ 15 февраля 2012

У вас вроде есть правильная идея, но вы упустили некоторые важные вещи при работе со строками в C (например, strlen)

Это должно удалить любые ведущие и конечныене алфавитно-цифровые символы ASCII.

#include <string.h>

char * remove_outer_punctuation( char * text )
{
    int i = 0;
    size_t len = 0;
    char * start = text;

    if ( text == NULL ) return NULL;

    len = strlen(text);

    if ( len < 1 ) return start;

    // advance start to the first alphanum character
    for ( i = 0 ; i < len; i++ ){
       if ( !isalpha(text[i]) ) { 
           start++;
       } else {
           continue;
       }
    }

    // find the final alphanumeric character and 
    // put a NUL after it
    for ( i = len; i > 0; i-- ){
       if ( isalpha(text[i] ) continue;
    }
    text[i+1] = 0x0;

    return start;
}

Имейте в виду, что это изменит входную строку (мы вставим NUL).Если вы не хотите, чтобы это делалось, сначала используйте strcpy.

0 голосов
/ 15 февраля 2012

Чтобы удалить начальный материал:

char * rm_head(char *str) {
  while(!isalpha(*str)) str++;
  return str;
}

и используйте его как:

  char *rest = rm_head(original);
0 голосов
/ 15 февраля 2012

В вашем коде есть несколько проблем:

ch [] = NULL;

в его определении должен быть тип:

char ch[15];

Не определять char массивы неопределенного размера.

Кроме того, что такое length в вашем коде?Вы можете использовать strlen(s) вместо length, для которого я не вижу определения.

Для токенизации вы можете использовать strtok.

Чтобы скопировать строки из одного массива в другой, используйте strcpy_s.

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