Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Ivy
Сообщений: n/a
#1

Строки C - C++

05.03.2010, 21:06. Просмотров 623. Ответов 9
Метки нет (Все метки)

Помогите написать программы в С.
1.Дана строка символов. Изменить строку – во всех словах, имеющих нечетное количество символов, средний символ удалить.
2.Дана строка символов. Группы символов между группами пробелов считаются словами. Определить число вхождений в последовательность слов группы букв «abc».
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2010, 21:06     Строки C
Посмотрите здесь:

Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки - Java
Помогите пожалуйста! 1)Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки. 2)Дана...

Строки. Если в конце строки точка отсутствует, то найти слово, заканчивающееся точкой и перенести его в конец строки. - Pascal
Дана строка, состоящая из слов и содержащая одну точку в конце одного из слов. Если в конце строки точка отсутствует, то найти слово,...

Строки. Даны строки S и So. Найти количество вхождений строки So в строку S - Turbo Pascal
Помогите пожалуйста, как сделать эту задачу без этих вот строчек... B:=TRUE; и без команды INC... Вот условие задачи: Даны строки S и...

Ввести строки и через n символов первой строки вставить вторую строку, и так до конца строки - C++ Builder
Помогите исправить баг задача состоит в следующем :ввести строку и простроку тоесть две строки и надо через (n) символов первой строки...

Сравнить строки, первый несовпадающий элемент строки-приемника записать в регистр AL, строки-источника - в DL - Assembler
Помогите написать программу на ассемблерене совсем еще разобрался с этим задание: Ввести с клавиатуры две строки одноразрядных...

Слить две строки, вставив символы одной строки между символами другой строки - Pascal
Строка a из n символов лексикографически меньше строки b из n символов, если существует такой индекс j, что aj < bj, а для всех i < j ai =...

Определить длину строки. Если длина строки >6, удалить часть строки в { } скобках. - Turbo Pascal
Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
05.03.2010, 22:48     Строки C #2
1
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*  
*   Дана строка символов. Изменить строку – во всех словах, имеющих нечетное количество символов, 
*   средний символ удалить.
*/
 
int main(void){
    char str[] = "abcde abcd abc abcdef abcdefg", *p;
    size_t len;
    
    printf("Befor: %s\nAfter: ", str);
    for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") ){
        if ( ( ( len = strlen(p) ) & 1 ) && ( len > 1 ) ){
            len /= 2;
            memmove(p + len, p + len + 1, len);
            *(p + 2 * len) = '\0';
        }
        printf("%s ", p);
    }
    printf("\n");
    
    exit(0);
}
Добавлено через 9 минут
2. Немного не понятно при таком условии - какая разница, чем слова разделяются, ну да ладно...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
*   Дана строка символов. Группы символов между группами пробелов считаются словами. 
*   Определить число вхождений в последовательность слов группы букв «abc».
*/
 
int main(void){
    char *str = "abcdef ghj serab cvb abc zzzrabc", *wrd = "abc", *p;
    size_t cnt = 0;
    
    for ( p = strstr(str, wrd); p != NULL; p = strstr(p + 1, wrd), ++cnt )
        ;
    
    printf("Group of \"%s\" meet in string \"%s\" %d times.\n", wrd, str, cnt);
    
    exit(0);
}
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
05.03.2010, 22:51     Строки C #3
Цитата Сообщение от easybudda Посмотреть сообщение
Немного не понятно при таком условии - какая разница, чем слова разделяются, ну да ладно...
"abc|abc" - это одно вхождение, но два если разделитель был бы '|'
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
05.03.2010, 23:05     Строки C #4
Цитата Сообщение от Ivy Посмотреть сообщение
Определить число вхождений в последовательность слов группы букв «abc».
Цитата Сообщение от insideone Посмотреть сообщение
"abc|abc" - это одно вхождение, но два если разделитель был бы '|'
Минуточку! Где написано, что на одно слово не больше одного вхождения? Это всё равно два вхождения, только оба в одном слове...

Добавлено через 9 минут
Впрочем вот и такой вариант
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
*   Дана строка символов. Группы символов между группами пробелов считаются словами. 
*   Определить число вхождений в последовательность слов группы букв «abc».
*/
 
int main(void){
    char str[] = "abcdef ghj serab cvb abc zzzrabc abc|abc", *wrd = "abc", *buf, *p;
    size_t cnt = 0;
    
    if ( ( buf = strdup(str) ) == NULL )
        exit(1);
    for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") )
        if ( strstr(p, wrd) )
            ++cnt;
    
    printf("Group of \"%s\" meet in %d words of string\n\"%s\"\n", wrd, cnt, buf);
    
    free(buf);
    exit(0);
}
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
05.03.2010, 23:18     Строки C #5
Цитата Сообщение от easybudda Посмотреть сообщение
Минуточку! Где написано, что на одно слово не больше одного вхождения? Это всё равно два вхождения, только оба в одном слове...
Хм, преподы сами не знают чего хотят. Хотя иногда студенты задания криво переписывают))) Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc". Да?
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
05.03.2010, 23:22     Строки C #6
Цитата Сообщение от insideone Посмотреть сообщение
Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc".
Не понял... Какой пробел куда добавить?
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
05.03.2010, 23:36     Строки C #7
easybudda, прошу прощения, попутал с поиском ^abc

easybudda, а пользуясь strtok() можно потом вернуть строку в исходный вид без создания копии? а то она по окончанию процессии становится обрезанной до первого токена
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
05.03.2010, 23:52     Строки C #8
Цитата Сообщение от insideone Посмотреть сообщение
а пользуясь strtok() можно потом вернуть строку в исходный вид без создания копии? а то она по окончанию процессии становится обрезанной до первого токена
Не-а! Строка убивается - на место символов-разделителей '\0' вставляется. Потому и сдублировал, чтобы было, что вывести...
Ну либо как-то так:
C
1
2
3
4
5
6
7
8
9
10
...
char str[] = "bla bla bla";
int i, len = strlen(str);
/*...
покромсали строку функцией strtok() 
... */
for ( i = 0; i < len; ++i )
  if ( !str[i] )
    str[i] = ' ';
/*...*/
но проще по-моему скопировать

Добавлено через 12 минут
insideone, к тому же, это хорошо, когда в качестве разделителя только пробел. А если к примеру
C
1
p = strtok(str, " ,.;:!?\t\n")
попробуй, угадай, что именно во входной строке на ноль заменилось
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
06.03.2010, 00:39     Строки C #9
Цитата Сообщение от easybudda Посмотреть сообщение
попробуй, угадай, что именно во входной строке на ноль заменилось

Не по теме:

Надо будет нанимать команду телепатов, не иначе а кромсать строку не хорошо...

И ещё вопрос... если бы я не знал что strdup выделяет память, то это было бы катострофически плохо ? Как то странно когда нужно освобождать память когда сам её не выделял
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2010, 00:48     Строки C
Еще ссылки по теме:

Строки. Определить длину введенной строки, если длина кратна 4, то первая часть строки меняется местами со второй - Turbo Pascal
Ввести с клавиатуры строку символов.признак окончания ввода строки-нажатие клавиши ввод.Программа должна определить длину введенной строки...

Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки - C++
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки. 1. Я дуб дубом,даже...

БД с операциями: добавление новой строки, удаление строки, редактирование имеющейся строки - PascalABC.NET
Нужно создать базу данных в паскале, с операциями: добавление новой строки, удаление строки, редактирование имеющей строки. Желательно с...

Строки. Даны строка S и подстрока S1.Удалить из строки S все вхождения строки S1 - Turbo Pascal
Даны строка S и подстрока S1.Удалить из строки S все вхождения строки S1.В строке S подсчитать кол-во вхождений строки S1.

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк - C++
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно сделать задание: &quot;Добавить строки, начиная...


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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
06.03.2010, 00:48     Строки C #10
Цитата Сообщение от insideone Посмотреть сообщение
И ещё вопрос... если бы я не знал что strdup выделяет память, то это было бы катострофически плохо ? Как то странно когда нужно освобождать память когда сам её не выделял
На вскидку не припомню, но точно есть ещё библиотечные функции кроме strdup(), которые создают в динамической памяти объекты и возвращают на них указатели. Про это пишут в мануалах к функциям и разумеется эти моменты необходимо учитывать. Тут это, конечно, не существенно, но лучше приучить себя помнить о таких вещах, иначе рано, или поздно, но обязательно получите проблему с утечкой памяти. А по поводу "Как то странно когда нужно освобождать память когда сам её не выделял" - смотрите на это вот, с какой стороны: не принципиально, какой именно функцией выделяется память - malloc(), или к примеру strdup(). Факт в том, что выделена какая-то часть из динамической памяти, получен на неё указатель. Соответственно после использования надо эту часть памяти вернуть.
Yandex
Объявления
06.03.2010, 00:48     Строки C
Ответ Создать тему
Опции темы

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