Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 22.12.2013
Сообщений: 8

Строки C

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

Студворк — интернет-сервис помощи студентам
Помогите написать программы в С.
1.Дана строка символов. Изменить строку – во всех словах, имеющих нечетное количество символов, средний символ удалить.
2.Дана строка символов. Группы символов между группами пробелов считаются словами. Определить число вхождений в последовательность слов группы букв «abc».
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2010, 21:06
Ответы с готовыми решениями:

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

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

Удалить строки, начиная со строки К1 и до строки К2 (динамические массивы)
#include <iostream> #include <ctime> #include <stdlib.h> using namespace std; int main() { srand((int)time(0)); ...

9
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.03.2010, 22:48
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);
}
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
05.03.2010, 22:51
Цитата Сообщение от easybudda Посмотреть сообщение
Немного не понятно при таком условии - какая разница, чем слова разделяются, ну да ладно...
"abc|abc" - это одно вхождение, но два если разделитель был бы '|'
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.03.2010, 23:05
Цитата Сообщение от 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);
}
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
05.03.2010, 23:18
Цитата Сообщение от easybudda Посмотреть сообщение
Минуточку! Где написано, что на одно слово не больше одного вхождения? Это всё равно два вхождения, только оба в одном слове...
Хм, преподы сами не знают чего хотят. Хотя иногда студенты задания криво переписывают))) Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc". Да?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.03.2010, 23:22
Цитата Сообщение от insideone Посмотреть сообщение
Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc".
Не понял... Какой пробел куда добавить?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
05.03.2010, 23:36
easybudda, прошу прощения, попутал с поиском ^abc

easybudda, а пользуясь strtok() можно потом вернуть строку в исходный вид без создания копии? а то она по окончанию процессии становится обрезанной до первого токена
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.03.2010, 23:52
Цитата Сообщение от 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")
попробуй, угадай, что именно во входной строке на ноль заменилось
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
06.03.2010, 00:39
Цитата Сообщение от easybudda Посмотреть сообщение
попробуй, угадай, что именно во входной строке на ноль заменилось

Не по теме:

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

И ещё вопрос... если бы я не знал что strdup выделяет память, то это было бы катострофически плохо ? Как то странно когда нужно освобождать память когда сам её не выделял
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.03.2010, 00:48
Цитата Сообщение от insideone Посмотреть сообщение
И ещё вопрос... если бы я не знал что strdup выделяет память, то это было бы катострофически плохо ? Как то странно когда нужно освобождать память когда сам её не выделял
На вскидку не припомню, но точно есть ещё библиотечные функции кроме strdup(), которые создают в динамической памяти объекты и возвращают на них указатели. Про это пишут в мануалах к функциям и разумеется эти моменты необходимо учитывать. Тут это, конечно, не существенно, но лучше приучить себя помнить о таких вещах, иначе рано, или поздно, но обязательно получите проблему с утечкой памяти. А по поводу "Как то странно когда нужно освобождать память когда сам её не выделял" - смотрите на это вот, с какой стороны: не принципиально, какой именно функцией выделяется память - malloc(), или к примеру strdup(). Факт в том, что выделена какая-то часть из динамической памяти, получен на неё указатель. Соответственно после использования надо эту часть памяти вернуть.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2010, 00:48
Помогаю со студенческими работами здесь

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2
Сформировать динамический двумерный массив, заполнить его случайными числами и удалить строки, начиная со строки К1 и до строки К2 вот...

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка...

Проблема с переносом символа в начало строки, сохраняя первоначальную длину строки
Добрый вечер! Нужно дополнить код.. Задание такое: В каждой строке удалить лишние пробелы между словами и разместить их по левому краю,...

Функция: поместить все цифры в начало строки, а буквы в конец строки
Дана строка, состоящая из букв и цифр. Написать функцию, которая помещает все цифры в начало строки, а буквы в конец строки (без...

Как первые два символа строки переставить в конец этой строки?
Собственно вопрос


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru