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'))){
Удаление символа в строке (си)
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);}
}
Код:
Код:
for(j=i ; j<len;j++)
a[j]=a[j++];
a[j]=a[j++];
Код:
a[j]=a[j+1];
Код:
len=strlen(a);
for(i=0; i<len;i++)
{printf("%c",a);}
for(i=0; i<len;i++)
{printf("%c",a);}
Код:
printf("%s",a);
Я же описал что нужно сделать...
Я не могу сказать, почему не работает программа, если не понимаю, как она работает. Или тебе просто нужен код работающей программы? Про ошибки в твоём коде я написал. Исправь, посмотри, заработает ли. Вообще, учись пользоваться пошаговой отладкой, если не можешь определить, почему программа не работает.
Ну если не тяжело напишите мне код, для выполнения моей задачи. Я сравню и внесу изменения.
Код:
#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;
}
#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;
}
А вы проверяли программу? У меня не работает :(
Извините. Все нормально. Спасибо за уделенное время.
Вообще, я тут подумал, и пришёл к выводу, что это ни фига не эффективный алгоритм - со смещениями. Сейчас же память не стоит по килобаксу за мегабайт. Так что можно было просто выделить память под результирующую строку и копировать в неё по очереди все символы, которые являются числом или буквой из первоначальной строки. В один проход получится. А со сдвигами много лишних перемещений. Посмотри в сторону этой реализации.
Код:
#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;
}
#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;
}
Можете подписать комментариями строки... Просто я начинающий и не очень понял.