0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
1

После каждой буквы предпоследнего слова вставить символ '*'. Лишние символы (с 81-ого) отбросить

01.12.2016, 15:33. Показов 2150. Ответов 12
Метки нет (Все метки)

После каждой буквы предпоследнего слова вставить символ '*'. Лишние символы (с 81-ого) отбросить. Использовать string.h и указатели.

Если честно, я без понятия, как это сделать, поэтому показывать мне нечего, ребят (разве что прототип функции).
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2016, 15:33
Ответы с готовыми решениями:

После каждой буквы предпоследнего слова вставить символ «*»
После каждой буквы предпоследнего слова вставить символ «*».

После каждой буквы предпоследнего слова вставить символ «*»
После каждой буквы предпоследнего слова вставить символ «*».

Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить
Задание : Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить....

После первой буквы каждого слова вставить символ “-”
После первой буквы каждого слова вставить символ “-”. Нужно в С++

12
130 / 130 / 157
Регистрация: 11.04.2015
Сообщений: 343
01.12.2016, 16:50 2
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
#include <stdio.h>
#include <string.h>
 
int main()
{
    char text[128] = "aaa bbb ccc ddd eee fff ggg hhh iii jjj KKK LLL MMM NNN OOO PPP RRR SSS TTT red buzzG rend.";
    int slen = 0, count = 0, index = 0, i = 0;
    char *ptr2 = NULL;
    char temp[80], temp_ch;
    slen = strlen(text);
    if (slen > 81) text[81] = '\0';
    memset(&text[81], '\0', sizeof(text) - 81);
    slen = strlen(text);
    for (i = slen; i != 0; i--) {
        if (text[i] == ' ') { count++; };
        if (count == 2) { index = i + 1; break; };
    };
    int num = slen - index;
    char *ptr = &text[index];
    memcpy(temp, ptr, num);
    temp[slen - index] = '\0';
    i = 1;
    while (temp[i] != ' ') {    
        memcpy(&temp[i + 1], &temp[i], num);
        temp[i] = '*';
        i+=2;
    }
    memcpy(ptr, temp, strlen(temp));
 
 
    return 0;
};
1
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
01.12.2016, 17:05  [ТС] 3
Компилируется, но при запуске бинарника падает с segmentation fault
0
1782 / 1032 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
01.12.2016, 17:11 4
Цитата Сообщение от a_lina19 Посмотреть сообщение
Лишние символы (с 81-ого) отбросить.
Имеется ввиду строка должна быть не длинней 81 символа или символы начинающиеся с 81го номера в таблице ascii?
Цитата Сообщение от a_lina19 Посмотреть сообщение
Компилируется, но при запуске бинарника падает с segmentation fault
temp[80] маловат.
1
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
01.12.2016, 17:13  [ТС] 5
strlen(строка) = 80, вот так должно быть.
UPD. temp[255] тоже маловат получается в таком случае
0
1782 / 1032 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
01.12.2016, 17:28 6
Не уверен, что правильно понял задание, но
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
#include <stdio.h>
#include <string.h>
 
#define DELIM " ,.?!\n\t"
 
char* next_to_last(char* str)
{
    char* end = &str[strlen(str)];
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    end++;
    return end;
}
int main(void)
{
    char buf[BUFSIZ];
    while (printf("String: ") && fgets(buf, 81, stdin) && *buf!='\n') {
        for(char* word = next_to_last(buf); !strchr(DELIM, *word); word++) {
            for (char* ptr = &word[strlen(word)]; ptr>word; ptr--) {
                *(ptr+1) = *ptr;
            }
            *++word = '*';
        }
        puts(buf);
    }
    return 0;
}
1
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
01.12.2016, 19:09  [ТС] 7
У меня ещё один вопрос.
На данный момент мы пишем в переменную buf через fgets().
А как сделать, чтобы работа велась с готовой строкой, заданной ранее?
Просто мне нужна функция, которая возвращает обработанную строку в main().

У меня была попытка сделать вот так:
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
char* next_to_last(char *s) {
    char* end = &s[strlen(s)];
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    end++;
    return end;
}
 
char *zadanie(char *s) {
    while (*s != '\n') {
        for(char* word = next_to_last(s); !strchr(DELIM, *word); word++) {
            for (char* ptr = &word[strlen(word)]; ptr>word; ptr--) {
                *(ptr+1) = *ptr;
            }
            *++word = '*';
        }       
    }
    return s;
}
 
// ....
 
char *result = zadanie(stroka_dannaya_ranee);
Но опять выходит segmentation fault
0
1782 / 1032 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
01.12.2016, 19:38 8
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
#include <stdio.h>
#include <string.h>
 
#define DELIM " ,.?!\n\t"
 
char* next_to_last(char* str)
{
    char* end = &str[strlen(str)];
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    end++;
    return end;
}
char* f(char* buf) // хотя возращать лишнее мы и так с указателем работает, буфер будет меняться
{
    for(char* word = next_to_last(buf); !strchr(DELIM, *word); word++) {
        for (char* ptr = &word[strlen(word)]; ptr>word; ptr--) {
            *(ptr+1) = *ptr;
        }
        *++word = '*';
    }
    return buf;
}
int main(void)
{
    char buf[BUFSIZ];
    while (printf("String: ") && fgets(buf, 81, stdin) && *buf!='\n') {
        f(buf); // поэтому не нужно присваивать возрват значения функции, а ее лучше сделать void
        puts(buf);
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
01.12.2016, 19:50  [ТС] 9
Смотрите, я хочу делать вот так:

C
1
2
3
4
5
int main() {
  gets(s); // ввели тут строку
  obrabotka(s); // передали строку в функцию, которая и делает всю работу
  puts(s); // вывел результат функции obrabotka(). 
}
То есть мне нужно сохранить всё в переменную, а потом уже выводить, а не выводить посимвольно.
0
273 / 132 / 44
Регистрация: 05.02.2015
Сообщений: 845
01.12.2016, 20:12 10
ну так:
C
1
2
3
4
void obrabotka(char *s)
{
// текст функции 
}
ведь строка - это символьный массив.
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
01.12.2016, 20:29  [ТС] 11
minore,

Вот так мне предложили:
C
1
2
3
4
5
6
7
8
9
int main(void)
{
    char buf[BUFSIZ];
    while (printf("String: ") && fgets(buf, 81, stdin) && *buf!='\n') {
        f(buf);
        puts(buf);
    }
    return 0;
}
А как-то так мне нужно:
C
1
2
3
4
5
6
7
int main(void) {
    gets(s);
    f(buf); // f обрабатывает _строку_ buf внутри себя и возвращает обратно для вывода _строку_
               // без итераций. Чтобы потом сделать вот так printf("%s", buf)  ну или:
    puts(buf);
    return 0;
}
0
1782 / 1032 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
02.12.2016, 02:31 12
Лучший ответ Сообщение было отмечено a_lina19 как решение

Решение

a_lina19, вообще, gets() небезопасная функция, вместо нее лучше использовать fgets().
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
// После каждой буквы предпоследнего слова вставить символ '*'. 
// Лишние символы (с 81-ого) отбросить. Использовать string.h и указатели.
#include <stdio.h>
#include <string.h>
 
#define DELIM " ,.?!\n\t"
 
char* next_to_last(char* str)
{
    char* end = &str[strlen(str)];
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    while (*end == ' ') end--;
    while (*end != ' ') end--;
    end++;
    return end;
}
char* f(char* buf)
{
    buf[80] = 0;
    for(char* word = next_to_last(buf); !strchr(DELIM, *word); word++) {
        for (char* ptr = &word[strlen(word)]; ptr>word; ptr--) {
            *(ptr+1) = *ptr;
        }
        *++word = '*';
    }
    return buf;
}
int main(void)
{
    char buf[BUFSIZ];
    gets(buf);
    f(buf);
    puts(buf);
    return 0;
}
1
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 8
02.12.2016, 08:22  [ТС] 13
Про небезопасность gets() я знаю, везде прямо пишут его не использовать. В университете решили по-другому. Всех отблагодарил, решение shvyrevvg работает. Единственное, что под разделителем мне нужно было понимать пробел.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2016, 08:22

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

Вставить в 1-ую строку самый часто повторяющийся символ 2-ой строки после каждой буквы
В Pascal: Вставить в 1-ую строку самый часто повторяющийся символ 2-ой строки после каждой буквы.

Отбросить лишние символы из ячеек с данными в цикле
Добрый день уважаемые форумчане, Нужна ваша помощь. Вопрос заключается в следующем. В первом...

Вставить после каждого слова, заканчивающегося на букву «о» слово «Ого»
Помогите пожалуйста создать программу в Pascal abc для задачи: Вставить после каждого слова, ...


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

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

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