Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 453, средняя оценка - 4.72
milke
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 14
#1

Удаление символа из строки - C++

27.01.2011, 16:49. Просмотров 74044. Ответов 31
Метки нет (Все метки)

Как удалить символ (скобку) в заданной символьной строке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 16:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление символа из строки (C++):

Удаление символа из строки - C++
Подскажите пожалуйста где я затупил ) Программа уделяет нужный символ, но после этого дописывает пустые символы... Как задать в нужном...

Удаление символа из строки - C++
всем привет как можно удалить символ из строки? посоветовали воспользоваться ф-ей memmove, но я новичек и не очень понял.. если...

Удаление символа строки - C++
Здравствуйте а есть такая функция которая удаляет из строки выбранный символ и соответственно сдвигает остальные

Удаление из строки символа, введенного пользователем - C++
Нужен код чтобы программа удаляла из строки символ, введенный пользователем и результат выводила на экран. Всем...

Работа со строками (удаление из строки указанного символа) - C++
Недавно начал изучать С++ в универе. Задали написать программу реализующую удаление из строки указанного символа. Программа компилируется,...

Удаление символа перевода строки из самого конца файла - C++
void SaveToFile() { ofstream out; out.open("Directory.txt"); Directory.Print(size, PrintEl, out); long pos = out.tellp(); ...

31
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.08.2011, 11:42 #16
Fra Dolcino, мой вариант на Си:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define SIZE 80
 
typedef int (*Pred)(char);
 
char* copyIf(char* dest, const char* src, Pred p);
int skip_NL_and_backslash(char);
 
int main(int argc, char* argv[])
{
    FILE* src;
    FILE* dst;
 
    char src_buf[SIZE];
    char dst_buf[SIZE];
    
    if(argc != 3)
    fprintf(stderr, "Usage: %s SOURCE DEST\n", *argv), exit(1);
 
    if((src = fopen(argv[1], "r")) == NULL)
    perror(argv[1]), exit(1);
 
    if((dst = fopen(argv[2], "w")) == NULL)
    perror(argv[2]), exit(1);
 
    while(fgets(src_buf, SIZE, src))
    {
    copyIf(dst_buf, src_buf, skip_NL_and_backslash);
 
    if(fputs(dst_buf, dst) == EOF)
        perror(argv[2]), exit(1);
    }
 
    if(ferror(src))
    perror(argv[1]), exit(1);
 
    fclose(src);
    fclose(dst);
    
    exit(0);
}
 
char* copyIf(char* dest, const char* src, Pred p)
{
    char* start = dest;
    
    while(*src)
    {
        if(p(*src))
            *dest++ = *src;
        ++src;
    }
    *dest = '\0';
    return start;
}
 
int skip_NL_and_backslash(char c)
{
    return strchr("\n\r\\", c) == NULL;
}
Пример использования:
Код
[nameless@desktop c]$ cat test.txt
\foo
bar\ baaz
quuz
[nameless@desktop c]$ ./sample test.txt output.txt && cat output.txt
foobar baazquuz[nameless@desktop c]$
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.08.2011, 11:51 #17
И да, на Винде перевод строки осуществляют два символа: '\n' и '\r'. В прочем, мой вариант должен корректно отработать и на Винде.
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 11:54 #18
Цитата Сообщение от Fra Dolcino Посмотреть сообщение
Не понял немного. Пишу на с++. У меня задача: есть файл, в котором записаны строки из цифр и в конце каждой строки стоит символ '\'. Нужно удалить '\' и соединить все строки в одну, без символа перехода на новую строку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
int main(){
    std::ifstream input("input.txt");
    std::string text, line;
    while (std::getline(input, line) )
        text += line;
    text.erase(std::remove(text.begin(), text.end(), '\\' ), text.end() );
    std::cout << text << std::endl;
}
Код
diagon@shadeware:~$ cat input.txt && ./a.out
\
 this \
is a \
  test   file \
 \
 this is a   test   file  
diagon@shadeware:~$
1
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
09.08.2011, 11:58 #19
Цитата Сообщение от Nameless One Посмотреть сообщение
И да, на Винде перевод строки осуществляют два символа: '\n' и '\r'.
В Linuxe так же, там в настройках терминала есть что-то типа "объединять символы \n и \r в один", к сожалению команду не помню, но если надо - смогу найти.
0
Nameless One
09.08.2011, 12:09
  #20

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
В Linuxe так же, там в настройках терминала есть что-то типа "объединять символы \n и \r в один", к сожалению команду не помню, но если надо - смогу найти
ты точно ничего не путаешь? Насколько я знаю, это отличительная особенность именно unix, а не используемого терминала

0
Fra Dolcino
0 / 0 / 0
Регистрация: 09.08.2011
Сообщений: 4
09.08.2011, 12:13 #21
diagon, спасибо! А есть вариант с выводом в тот же файл?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.08.2011, 12:19 #22
Fra Dolcino, а самому немножко подумать?
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 12:19 #23
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
int main(){
    std::fstream input("input.txt");
    std::string text, line;
    while (std::getline(input, line) )
        text += line;
    text.erase(std::remove(text.begin(), text.end(), '\\' ), text.end() );
    input.close();
    input.open("input.txt", std::fstream::out);
    input << text;
}
Это если заменить текст.
Если добавить в конец - замените на std::fstream::app
1
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
09.08.2011, 12:40 #24

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Насколько я знаю, это отличительная особенность именно unix
Вообще-то я в Linux/*nix не силен, но я в Ubuntu менял эти настройки (точнее, как пишут в книгах, настройки драйвера терминала), так, чтоб символ '\n' это был именно переход на новую строку, а не переход и возврат каретки. А Ubuntu, как известно, это не Unix

.
0
Nameless One
09.08.2011, 12:55
  #25

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
так, чтоб символ '\n' это был именно переход на новую строку, а не переход и возврат каретки
ну так я и говорю, что в unix символ '\n' - это аналог "\r\n" в windows

0
Сыроежка
Заблокирован
09.08.2011, 15:09 #26
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:


ну так я и говорю, что в unix символ '\n' - это аналог "\r\n" в windows

В С и в С++ - это один символ, называемый концом строки. При использовании стандартных функций вывода представление этого символа в выходном потоке является платформа-зависимым.
0
Bambaster01
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 52
06.04.2014, 23:27 #27
Народ, а как тогда реализовать функцию, которая будет в строке сдвигать все знаки препинания в конец строки из файла?
0
smokeman
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.02.2016, 20:38 #28
Цитата Сообщение от dr.curse Посмотреть сообщение
s.erase(i,1); // удаляет из строки символ с индексом i
а "1"-это количество удалённых символов?

Добавлено через 29 минут
Цитата Сообщение от Bambaster01 Посмотреть сообщение
Народ, а как тогда реализовать функцию, которая будет в строке сдвигать все знаки препинания в конец строки из файла?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 using namespace std;
 
  int main(){
    cout<<"VVedite soobshenie"<< endl;
    int i;
    string s;
    string tmp ="";
    cin>>s;
    for(i=0;i<s.size();i++){
    if (s[i] == '/' || s[i] == '.' || s[i] == ',' || s[i] == '-' || s[i] == '...'){
        tmp = s[i]+tmp;
        s = s.erase(i,1);
    }
    }
    s = s+ tmp;
    cout<<s;
  }
Если что не так,прости,писал на коленках
0
Павлина
0 / 0 / 0
Регистрация: 19.05.2016
Сообщений: 10
17.01.2017, 18:27 #29
Вопрос:если это не строка строго говоря, а массив символов?
Если присвоить символу значение /0, то все символы после него теряются?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
17.01.2017, 19:24 #30
Цитата Сообщение от Павлина Посмотреть сообщение
Если присвоить символу значение /0, то все символы после него теряются?
'\0'
Нет, они остаются на месте, но стандартные сишные функции будут думать, что далее ничего не идёт, т.к. внутри их алгоритмов идёт проверка, что стоит двигаться до ноль-символа.

Не по теме:

Эх, какие люди были в треде.. Я уж обрадовался, пока дату не посмотрел.

1
17.01.2017, 19:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2017, 19:24
Привет! Вот еще темы с ответами:

Класс строки (удаление из строки слова с заданным номером и символа с заданным номером) - C++
Описать в классе (строки) функции удаления из строки слова с заданным номером и символа с заданным номером. Каждая функция возвращает новую...

Как скопировать подстроку из строки до определенного символа? Или удалить, начиная с этого символа - C++
Добрый вечер. Ответ искал, но не нашёл. Предположим, есть строка: ABC|DEF Надо скопировать всё до | , т.е., в приведённом...

Создать строку: с начало три символа первой строки, потом эти же три символа в обратном порядке - C++
Помогите пожалуйста! Ввести строку символов. Создать новую строку следующим образом: с начало три символа первой строки, потом эти же три...

Копирование из строки от символа до символа - C++
Как скопировать со строки в другую строку значение от одного какого-либо символа, до другого, и при этом что бы копирование производилось...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru