Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление символа в строке (си)

71K
25 марта 2012 года
SHumiC
19 / / 15.02.2012
Доброе время суток. Нужна помощь в реализации задачи по удалению символа с строки. То есть,
1)вводится строка .
2)проверяется в цикле на наличие буквы или цифры.
3)если это символ, его нужно удалить(смещая символы в лево, присваивая их).
4)вывести новую строку без символов.

Но программа почему то не работает. Прошу помочь, желательно объяснить в чем причина.


#include <stdio.h>
#include <string.h>
void main()
{
char a[100];
int i,len,j;

printf("Введите строку ");
gets(a);
len=strlen(a);
for(i=0; i<len;i++){
if(!((a[ i] >= 'a' && a[ i] <= 'z') ||
(a[ i] >= 'A' && a[ i] <= 'Z') ||
(a[ i] >= 'а' && a[ i] <= 'я') ||
(a[ i] >= 'А' && a[ i] <= 'Я') ||
(a[ i] >= '0' && a[ i] <= '9'))){
for(j=i ; j<len;j++)
a[j]=a[j++];
};
len=strlen(a);
for(i=0; i<len;i++)
{printf("%c",a);}

}
316
25 марта 2012 года
Alm3n
889 / / 29.05.2009
Для оформления кода нужно использовать тег [cоde].
 
Код:
if(!((a[ i] >= 'a' && a[ i] <= 'z') ||
 (a[ i] >= 'A' && a[ i] <= 'Z') ||
 (a[ i] >= 'а' && a[ i] <= 'я') ||
 (a[ i] >= 'А' && a[ i] <= 'Я') ||
 (a[ i] >= '0' && a[ i] <= '9'))){
Точно не понял, что это, но предполагаю, что это проверка входа символа в диапазон a-z A-Z 0-9. Если так, то можно заменить всё это на isdigit(), isalpha(). А лучше isalnum().
 
Код:
for(j=i ; j<len;j++)
 a[j]=a[j++];
j будет увеличено два раза. Нужно писать
 
Код:
a[j]=a[j+1];
Либо не инкрементировать j выше.
 
Код:
len=strlen(a);
 for(i=0; i<len;i++)
 {printf("%c",a);}
Не нужно. Если хочешь вывести всю строку, то
 
Код:
printf("%s",a);
В общем, что делает код, я не понял.
71K
25 марта 2012 года
SHumiC
19 / / 15.02.2012
Я же описал что нужно сделать...
316
25 марта 2012 года
Alm3n
889 / / 29.05.2009
Я не могу сказать, почему не работает программа, если не понимаю, как она работает. Или тебе просто нужен код работающей программы? Про ошибки в твоём коде я написал. Исправь, посмотри, заработает ли. Вообще, учись пользоваться пошаговой отладкой, если не можешь определить, почему программа не работает.
71K
25 марта 2012 года
SHumiC
19 / / 15.02.2012
Ну если не тяжело напишите мне код, для выполнения моей задачи. Я сравню и внесу изменения.
316
25 марта 2012 года
Alm3n
889 / / 29.05.2009
Код:
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main()
{
    char a[100];
    int i = -1;
    printf("Введите строку ");
    gets(a);
    int len = strlen(a);
    while (++i != len)
        if (!isalnum(a[i]))
        {
            int j = i--;
            --len;
            while (++j != len+1)
                a[j-1] = a[j];
        }
    a[len] = '\0';
    printf("%s\n",a);
    return 0;
}
71K
26 марта 2012 года
SHumiC
19 / / 15.02.2012
А вы проверяли программу? У меня не работает :(
71K
26 марта 2012 года
SHumiC
19 / / 15.02.2012
Извините. Все нормально. Спасибо за уделенное время.
316
26 марта 2012 года
Alm3n
889 / / 29.05.2009
Вообще, я тут подумал, и пришёл к выводу, что это ни фига не эффективный алгоритм - со смещениями. Сейчас же память не стоит по килобаксу за мегабайт. Так что можно было просто выделить память под результирующую строку и копировать в неё по очереди все символы, которые являются числом или буквой из первоначальной строки. В один проход получится. А со сдвигами много лишних перемещений. Посмотри в сторону этой реализации.
11K
09 апреля 2012 года
xAtom
65 / / 17.01.2011
С одним проходом
Код:
#include <stdio.h>
#include <ctype.h>

char* str_remove(char* s) {
   char* t = s;
   char* a, *b;
   for(a = s, b = s; *b = *a; *a++) {
      if(! isalnum(*a))
          *b++;
   }
   return t;
}

int main(void) {
   char s[128] = "[ops]<123405006>.(opsabweABSDE)";
   /*
   printf("enter str: ");
   scanf("%127[^\n]", s);
   */

   puts( str_remove(s) );
   
   getchar();
   return 0;
}
71K
10 апреля 2012 года
SHumiC
19 / / 15.02.2012
Можете подписать комментариями строки... Просто я начинающий и не очень понял.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог