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

Строки C - C++

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

C++ Как считать строки из файла, если там больше одной строки?
C++ Указать номер строки, максимально удаленной от первой строки заданной матрицы
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней C++
C++ Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки
C++ Функция перезаписывает символы строки заданным количеством символов другой строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
 Аватар для insideone
3619 / 897 / 47
Регистрация: 10.01.2010
Сообщений: 2,420
05.03.2010, 22:51     Строки C #3
Цитата Сообщение от easybudda Посмотреть сообщение
Немного не понятно при таком условии - какая разница, чем слова разделяются, ну да ладно...
"abc|abc" - это одно вхождение, но два если разделитель был бы '|'
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
 Аватар для insideone
3619 / 897 / 47
Регистрация: 10.01.2010
Сообщений: 2,420
05.03.2010, 23:18     Строки C #5
Цитата Сообщение от easybudda Посмотреть сообщение
Минуточку! Где написано, что на одно слово не больше одного вхождения? Это всё равно два вхождения, только оба в одном слове...
Хм, преподы сами не знают чего хотят. Хотя иногда студенты задания криво переписывают))) Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc". Да?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.03.2010, 23:22     Строки C #6
Цитата Сообщение от insideone Посмотреть сообщение
Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc".
Не понял... Какой пробел куда добавить?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3619 / 897 / 47
Регистрация: 10.01.2010
Сообщений: 2,420
05.03.2010, 23:36     Строки C #7
easybudda, прошу прощения, попутал с поиском ^abc

easybudda, а пользуясь strtok() можно потом вернуть строку в исходный вид без создания копии? а то она по окончанию процессии становится обрезанной до первого токена
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
 Аватар для insideone
3619 / 897 / 47
Регистрация: 10.01.2010
Сообщений: 2,420
06.03.2010, 00:39     Строки C #9
Цитата Сообщение от easybudda Посмотреть сообщение
попробуй, угадай, что именно во входной строке на ноль заменилось

Не по теме:

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

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

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2 C++
Прибавить ко всем элементам каждой строки максимальное значение этой строки C++
Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк C++

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

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

Текущее время: 23:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru