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

> Внимание!

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

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

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


Я.
****

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

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


Подскажите, пожалуйста, как из строки удалить слово?

Пока реализовывал, понял из strcat, что char и const char разные типы (почему, что, где еще пока не понял). Решил обойти этот момент через указатели, но здесь меня вообще убило.

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

int main (){
char s[] ="The; first E36 M3, to be imported to the United States: was the 1995 model.";
char *p; //если закомментировать эту строку
char *n;
printf("%s\n",s);
//*n='\0'; и раскомментировать эту
printf("%s\n",n);

n=s;

printf("%s\n",n);
return 0;
}

получаются чудеса: в *n хранится часть строки s. Если не ошибаюсь, вот эта the 1995 model. Следственно закомментированая строка ее очищает. И, самое поразительное, что потом при n=s; в n сохраняется оставшаяся часть строки The; first E36 M3, to be imported to the United States: was.
Сможете объяснить такой феномен? lol.gif


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


Гость






Цитата
получаются чудеса: в *n хранится часть строки s
Во-первых, в *n ничего не хранится. n указывает куда-то. Чувствуешь разницу? Второе: любой компилятор тебя предупредит, что переменная n не инициализирована (а стало быть может указывать куда угодно). Третье - и что тебе показывает тот код, который приведен? Мне оно говорит вот что:
The; first E36 M3, to be imported to the United States: was the 1995 model.

Process returned -1073741819 (0xC0000005) execution time : 3.734 s
Press any key to continue.


, попутно пытаясь послать отчет Биллу Гейтсу (при попытке распечатать строку, на которую указывает n).

Цитата
И, самое поразительное, что потом при n=s; в n сохраняется оставшаяся часть строки
Еще раз: в n ничего не сохраняется, кроме указателя на строку. Ты приравнял один указатель другому (а не одну строку другой). То, на что указывала s теперь скопировано и в n (n указывает туда же). И что ты удивляешься?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Я.
****

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

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


С указателями разобрался, но все таки с char и const char в strcat не могу. Помогите, пожалуйста, закомментированый код на Си перевести. Также хотел бы узнать как стоку "обнулить" (n:='';)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>

int main (){
const char *p ="The; first E36 M3, to be imported to the United States: was the 1995 model.";
char n[255];
char w[255];

//n:='';w:='';

p--;
while(*++p!=NULL){
printf("%c", *p);
if (((ispunct(*p)!=NULL)||(*p==' '))||(*(p+1)==NULL)){
//if w='' then
// n:=n+*p
//else
// begin
// n:=n+w;
// w='';
// end;
}
else{
//w:=w+*p;
}
}

return 0;
}

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


Гость






Не-не-не... Не надо переводить код, работающий со строками с Паскаля на С. Уж очень по-разному эти языки со строками работают. Ты лучше задачу поставь, что именно тебе надо сделать? Какое слово ты хочешь из строки удалить? Покажем, как это сделать в стиле С...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Я.
****

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

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


Да любое. Например, если в слово имеет определенную длину. Мне бы принцип понять) Я сделал с помощью strtok, но он же выделяет только слова, а разделители отсекаются.

Добавлено через 5 мин.
Так же меня удивило, что *p не является const char.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Вот так:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
int main (){
const int L = 2; // Будем удалять слова вот такой длины

const char *p =
"The; first E36 M3, to be imported to the United States: was the 1995 model.\0";

char s[256] = {0}; // сюда пишем строку - результат
char *pp = s; // указатель на строку - результат

int len = 0; // длина слова
for(; *p; p++) // идем по строке
{
if(strchr(";:.,!? ", *p)) // текущий символ - разделитель?
{
if(len == L) // да... Предыдущее слово - нужной длины?
{
pp -= L; // да... Значит, отходим на L символов назад...
}
len = 0; *pp++ = *p; // В любом случае слово закончилось,
// значит длина его обнуляется, да
// и разделитель заносим в результ. строку
}
else
{
len += 1; // нет, это был не разделитель... длину
*pp++ = *p; // увеличиваем, символ пишем в результат...
}
}
*pp = '\0'; // на всякий случай завершаем строку нулем...

printf("%s\n", s); // вот и все, строка готова...
return 0;
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Я.
****

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

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


char s[256] = {0}; Это очистка строки?


Добавлено через 14 мин.
Класс! good.gif
Только на паскаль не похоже... А реализация с помощью strcat, strlen возможна?


Добавлено через 2 мин.
И, надеюсь, последний вопросик: вот эту (ispunct(*p)!=NULL)||(*p==' ') строку вы заменили на strchr(";:.,!? ", *p) с какой-то целью или просто, для наглядности?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
char s[256] = {0}; Это очистка строки?
Да, это присвоение каждому элементу (символу) строки значения 0. В случае символа происходит приведение 0 к типу char, и записывается '\0'

Цитата
Только на паскаль не похоже...
Я ж тебе говорил, что это разные методы smile.gif

Цитата
А реализация с помощью strcat, strlen возможна?
Может и возможна, но мне проще не извращаться с использованием этих функций, а написать без них.

Добавлено через 5 мин.
Цитата
вот эту (ispunct(*p)!=NULL)||(*p==' ') строку вы заменили на strchr(";:.,!? ", *p) с какой-то целью или просто, для наглядности?
Мне так проще, потому что я сам устанавливаю, что именно является разделителем, а не кто-то за меня устанавливает. Вот видишь, тебе понадобилось добавить пробел - добавлено еще одно условие. А если надо учесть еще и скобки? Еще 2 условия добавлять будешь? В моем случае достаточно добавить все необходимые символы в первый параметр strchr, и никаких дополнительных условий не надо.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Я.
****

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

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


Цитата
А реализация с помощью strcat, strlen возможна?
Может и возможна, но мне проще не извращаться с использованием этих функций, а написать без них.

А вот тогда как можно сделать, например, такую задачу:
Ввести строку и присоединить ее к другой.

const char *s1="mama \0";
char s2[255];

scanf( );


Каким образом можно считать строку в переменную? %s до пробела считывает.
Для strcat не подходит формат ни первой, ни второй строки. Неужели как-то так *pp++ = *p; ?


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


Гость






scanf - это далеко не единственная функция для ввода строк, если что... Еще есть gets, например, которая читает до '\n'
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Я.
****

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

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


Допустим считал, а дальше как?
Кстати, я проверил, ispunct как и написано в книжке отбирает "все печатаемые символы, которые не относятся ни к алфавитно-цифровым, ни к "пробельным", т.е. скобки тоже входят.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата
т.е. скобки тоже входят.
Ага. А если мне НЕ надо, чтоб скобки входили - что делать? smile.gif

Цитата
а дальше как?
А дальше - понять: то, что описывается как const char * изменяться не может. Следовательно, нужно одну неконстантную строку для ввода, а вторую - для хранения результата:
    const char *s1="mama \0";
char s2[255], result[255];
gets(s2);
strcpy(result, s1);
strcat(result, s2);

printf("%s\n", result);
 К началу страницы 
+ Ответить 

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

 





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