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

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

Войти
Регистрация
Восстановить пароль
 
phyzalis
#1

Заменить в строке символы ":" на ";" - C++

16.01.2013, 22:45. Просмотров 572. Ответов 13
Метки нет (Все метки)

Задание следующее: в строке из n символов (задается из консоли) заменить все символы ":" символами ";".
Проблема: программа завершает работу сразу после ввода значения n. Подскажите, есть ли ошибка, и если да, то где?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    char *str;
    int n;
    cout<<"n=";
    cin>>n;
    str=(char*)malloc(n*sizeof(char));
    cout<<"enter string: ";
    gets(str);
    for (int i = 0; i <= strlen(str); i++) {
        if (*(str+i) == ':') {
            *(str+i) = ';';
        }
    }   
    puts(str);
    free(str);
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 22:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заменить в строке символы ":" на ";" (C++):

Найти и заменить в строке все символы "а" на "b" - C++
найти и заменить в ней все символы &quot;а&quot; на &quot;b&quot;

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Дана строка символов. Определить, стоят ли подряд в этой строке символы "а" и "б" - C++
Дана строка символов. Определить, стоят ли подряд в этой строке символы &quot;а&quot; и &quot;б&quot;

В заданом тексте заменить все символы ":" на символы "-" и наоборот - C++
В заданом тексте заменить все символы &quot;:&quot; на символы &quot;-&quot; и наоборот.

Введите предложение, в данной строке нужно заменить все слова "погрешность" на "ошибка" - C++
Введите предложение, в данной строке нужно заменить все слова &quot;погрешность&quot; на &quot;ошибка&quot;.

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

13
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 22:48 #2
phyzalis, std::replace
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
16.01.2013, 23:01 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    char *str;
    int n;
    
    cout << "n = ";
    cin >> n; // после ввода целого числа в буфере ввода останется несчитанным символ '\n'...
    cin.ignore(); // ...пропускаем его 
    
    ++n;
    str = (char*) malloc(n * sizeof(char));
    
    cout << "enter string: ";
    cin.getline(str, n);
    
    for (int i = 0; *(str + i) != '\0'; i++) {
        
        if (*(str + i) == ':') {
            
            *(str + i) = ';';
        }
    }   
    cout << str << endl;
    free(str);
2
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
16.01.2013, 23:02 #4
Или
C++
1
2
3
4
5
6
7
8
9
10
char* tok;
char* outstr=new char [strlen(str)];
outstr[0]='\0';
tok=strtok (str,";");
while (tok)
{
strcat(outstr,tok);
strcat(outstr,";");
tok=strtok(NULL,";");
}
Можно еще так.
В outstr будет нужна строка.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.01.2013, 00:49 #5
Wolkodav, во-первых не правильно. Во-вторых не эффективно.

Добавлено через 3 минуты
rangerx, в цикле лучше бы указатель наращивали, а не доп. переменную. Эффективней(опять же доп. Указатель). Конечно мое сообщение из разряда придирок, и мы не знаем как его компилятор оптимизирует, ну так просто ради диалога
0
Kuzia domovenok
1960 / 1813 / 143
Регистрация: 25.03.2012
Сообщений: 6,288
Записей в блоге: 1
17.01.2013, 00:50 #6
Цитата Сообщение от go Посмотреть сообщение
Wolkodav, во-первых не правильно. Во-вторых не эффективно.
Пока что самый эффективный метод предложил rangerx, IMHO
0
phyzalis
17.01.2013, 00:53 #7
Большое спасибо!
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,055
Записей в блоге: 17
17.01.2013, 01:02 #8
Ну если про указатели, то еще вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//---------------------------------------------------------------------------
void my_replace(char *str)
{
    for( ; *str; ++str)  if(*str==':') *str=';';
}
//---------------------------------------------------------------------------
int main()
{
char str[]="1a2b3:4c5:78";
 
my_replace(str);
 
std::cout<<str<<std::endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
0
MrGluck
Модератор
Эксперт CЭксперт С++
7492 / 4607 / 693
Регистрация: 29.11.2010
Сообщений: 12,606
17.01.2013, 01:03 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
 
int main()
{
    int N;
    std::cin >> N;
    char* str = new char[++N];
    std::cin.ignore();
    std::cin.getline(str, N);
    std::replace(str, str + N, ':', ';');
    std::cout << str << std::endl;
    delete []str;
}
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.01.2013, 01:23 #10
Kuzia domovenok, покуда только Avazart, вариант с шаблонами тоже сильно затратный.

Добавлено через 38 секунд
Kuzia domovenok, там простая индексация. Это медленно.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,055
Записей в блоге: 17
17.01.2013, 02:08 #11
Цитата Сообщение от go Посмотреть сообщение
Kuzia domovenok, покуда только Avazart, вариант с шаблонами тоже сильно затратный.
Добавлено через 38 секунд
Kuzia domovenok, там простая индексация. Это медленно.
Ну если мотыгой собирать, то возможно...

Если смотреть под "оптимизацией" упрощением записи, то вариант rangerx превратится в мой...
Если мой вариант обобщить, то получим вариант с шаблонами, который после инсталирования ...

Добавлено через 1 минуту
Но походу основная проблема была в правильном считывании строки...
0
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
17.01.2013, 11:32 #12
go, Ну про неправильность я бы еще поспорил))
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.01.2013, 12:32 #13
Wolkodav, а что спорить. У вас в коде описка.
0
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
17.01.2013, 18:33 #14
Возможно)
0
17.01.2013, 18:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 18:33
Привет! Вот еще темы с ответами:

На C++ в строке после символа - "+" поставить символ "*" и посчитать сколько "+" - C++
С++ Мы вводим вручную строку , (через cin &gt;&gt; )программа должна после каждого &quot;+&quot; поставить &quot;*&quot; потом посчитать сколько всего было &quot;+&quot;...

В тексте заменить символы "fh" на символ "с" - C++
дан входной файл нужно обработать и записать в выходной вот задание В тексте заменить символы &quot;fh&quot; на символ &quot;с&quot;. В тексте несколько...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...


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

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

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