IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Строки, C
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Задание :

Дана строка символов. Удалить из строки все знаки препинания. Вывести исходную и преобразованные строки на экран.

вот мой код :


#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#define slength strlen
#include <STRLIB.cpp>

void main()
{
char* c;
char* s;
int i;
cout<<"Введите строку";
cin>>c;
s=c;
i=1;
do
{
if (s[i]='.')
sdelete(s,i,1);
else ++i;
}
while (i>=slength(s));


cout<<"Новая строка "<<s<<endl;
cout<<"Старая строка "<<c<<endl;
getche();
}



А вот файл STRLIB.cpp , с функциями, который я подключаю :


#define slength strlen
int spos(char *c, char *s);
char *scopy( char *s, int k, int n);
void sdelete(char *s, int k, int n);
char* sinsert(const char *c, char *s, int k);
char * strnorm(char *s);
int spos(char *c, char *s)
{
char *ptr;
ptr = strstr(s, c);
return ptr-s;
}
char *scopy( char *s, int k, int n)
{
char *ptr=strdup(s);
int i,j;
for( i=0, j=k; i<n && s[i]!='\0'; i++,j++)
ptr[i]=s[j];
ptr[i]='\0';
return ptr;
}
void sdelete(char *s, int k, int n)
{
for (int i=k,j=k+n; s[i]!='\0';i++,j++)
s[i]=s[j];
}
char* sinsert(const char *sc, char *sd, int k)
{
char *p=strdup(sd);
strcat(p,sc);
int i,j,lc=strlen(sc);
for (i=0;i<k;i++)
p[i]=sd[i];
for (j=0;j<lc;j++,i++)
p[i]=sc[j];
for (j=k;sd[j]!='\0';i++,j++)
p[i]=sd[j];
p[i]='\0';
return p;
}
char * strnorm(char *s)
{
char *p=strdup(s);
int pos=spos(" ",p);
cout<<"pos="<<pos<<endl;
while (pos>=0)
{
sdelete(p,pos,1);
pos=spos(" ",p);
cout<<"pos="<<pos<<endl;
}
if (p[0]==' ')
sdelete(p,0,1);
if (p[slength(p)-1]!=' ')
strcat(p," ");
cout<<"p= |"<<p<<"|"<<endl;
return p;
} // end of strnorm



Подскажите, где у меня ошибка ?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Во-первых, почему
#include <STRLIB.cpp>
? У тебя этот файл находится в системном каталоге? Если в текущем - то
#include "STRLIB.cpp"


Во-вторых:
do {
if (s[i]='.') // Ты ПРИСВАИВАЕШЬ, а не сравниваешь...
sdelete(s,i,1);
else ++i;
} while (i>=slength(s));
Сравнение - удвоенный символ ==
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +



#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#define slength strlen
#include <STRLIB.cpp>

void main()
{
char* c;
char* s;
int i;
cout<<"Введите строку";
cin>>c;
s=c;
i=1; // если написать здесь i=0, то удалеят первый символ...может здесь что то не то ?
do
{
if (s[i]=='.')
sdelete(s,i,1);
else ++i;
}
while (i>=slength(s));


cout<<"Новая строка "<<s<<endl;
cout<<"Старая строка "<<c<<endl;
getche();
}


С #include у меня всё в порядке, т.е. файл в системном каталоге.

Всё сделал...только почему то не работает...выводит такую же строку, т.е. не удаляет символ.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






int main()
{
char c[256];
char *s;
int i;

cout << "enter the string" << endl;

// Для того, чтобы ввести строку, возможно с пробелами
cin.getline(c, 256);

s = scopy(c, 0, 256); // Копирование СТРОКИ, а не указателя
i = 0;
do {
if (s[i] == '.') sdelete(s, i, 1);
else ++i;
} while(i <= slength(s)); // <--- Знак !!!

cout << "new string " << s << endl;
cout << "old string " << c << endl;
getche();
return 0; // Стандарт требует
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Спасибо, как всегда на высоте

Сообщение отредактировано: Merlin -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 17:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name