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

Удалить два первых слова из массива строк

10.02.2018, 18:41. Показов 1364. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня.
Есть массив строк, в котором нужно удалить два первых слова. С помощью какой действия можно узнать с какой позиции нужно скопировать в другую переменную strcpy(str2,str1)?
И один глупый вопрос как вывести массив строк str[i][j]?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 int i=0,j=0,t=0;dlin=0;
         char str[M][N];
for (int t=0; t<M; t++)
    {
        gets(str[t]);
        dlin=strlen(str[t]);
        if(0==dlin) break;
        }
            for (int i=0; i<t; i++)
            {
              for(int j=0; str[i][j]; j++)
              printf("%c", str[i][j]);
              printf ("%c", '\n');
            }
Добавлено через 22 минуты
Проблему с выводом двумерного массива решил. Теперь осталось удалить первые два слова.

Добавлено через 51 минуту
Понимаю что нужно искать по пробелам, но не понимаю пока, что для этого использовать.

Добавлено через 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
int main()
{
    setlocale(0,"");
    char str[M][N];
    int n=0,dlin=0,word=0,kol=0,st=0,t1=0,t=0,i=0,j=0;
    for (int t=0; t<M; t++)
    {
        gets(str[t]);
        dlin=strlen(str[t]);
        if(0==dlin)
        {
            st=t;
            break;
        }
    }
    cout<<"\n";
    for (int i=0; i<st; i++)
    {
        cout<<"\n";
        dlin=strlen(str[i]);
        if (0==dlin) break;
        for (int j=0; j<dlin; j++)
            cout<<str[i][j];
    }
    return 0;
}
Добавлено через 26 минут
Узнал количество пробелов. Но как запомнить позицию копирования с этого места?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2018, 18:41
Ответы с готовыми решениями:

Удалить из файла два первых числа
доброго времени суток!! не могли бы вы подсказать что мне нужно делать дальше с этой прогой: ...

Определить в файле два первых слова по алфавиту
всем привет. пишу программу. определяю в файле два первых слова по алфавиту. посмотрите,...

Удалить два последним слова из строки, в которой слова разделяются одним или несколькими пробелами
работа со строками! задача: удалить два последним слова из строки, в которой слова разделяются...

Удалить два последним слова из строки, в которой слова разделяются одним или несколькими пробелами
задача: удалить два последним слова из строки, в которой слова разделяются одним или несколькими...

18
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.02.2018, 20:34 2
eNerGy3,
C++
1
2
3
4
5
char *s = "a s df", *pos;
int count = 0;
pos = s;
while (count != 2)
    count += *pos++ == ' ';
pos будет на 1 больше всё время, т.е. будет указывать на "d".
0
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
10.02.2018, 20:53 3
Цитата Сообщение от outoftime Посмотреть сообщение
C++
1
2
while (count != 2)
* * count += *pos++ == ' ';
Хитро, но ограничитель на '\0' / ~>size я бы поставил, хоть это и является проблемой входных данных;

Не по теме:

Не буду тут про порбелы, запятые, etc... Просто чтоб цикл в "бесконечность" не уходил.

0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
10.02.2018, 21:08  [ТС] 4
Благодарен за помощь. Сделал пока так, но это работа с одной строкой. Как его переделать на строки(массив)?

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
void tcopy(char stroka[])
{
    int k=0;
    char str[128];
    str[0]='\0';
    char *word=strtok(stroka," ");
 
    while(word!=NULL)
    {
        if (k>=2) {strcat(str,word);strcat(str," ");}
        word=strtok(NULL," ");
        ++k;
    }
    strcpy(stroka,str);
}
 
int main()
{
    char str2[128],stroka[128];
    int i=0,dl=0;
    cout<<"Enter a string\n";
    gets(stroka);
    tcopy(stroka);
    //dl=strlen(stroka);
    printf("%s ",stroka);
    return 0;
}
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.02.2018, 21:26 5
Цитата Сообщение от eNerGy3 Посмотреть сообщение
Сделал пока так
А как хорошо всё начиналось...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <memory>
#include <cstring>
 
char *ltrim(std::unique_ptr<char[]> s)
{
    int count = 0;
    char *pos = s.get();
    while (count != 2 && *pos)
        count += *pos++ == ' ';
    char *ans = new char[strlen(s.get()) - (pos - s.get())];
    strcpy(ans, pos);
    return ans;
}
 
int main()
{
    char *s = new char[20];
    strcpy(s, "asdf asdf sadsd");
    s = ltrim(std::unique_ptr<char[]>(s));
    std::cout << s << std::endl;
}
0
705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
10.02.2018, 21:33 6
eNerGy3, на основе вашей программы:

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
#include <iostream>
using namespace std;
void tcopy(char stroka[])
{
    int k=0;
    char str[128];
    str[0]='\0';
    char *word=strtok(stroka," ");
    while(word!=NULL)
    {
        if (k>=2) {strcat(str,word);strcat(str," ");}
        word=strtok(NULL," ");
        ++k;
    }
    strcpy(stroka,str);
}
 
int main()
{
    char stroka[99][128];
    for(int i=0;i<99;i++){
        cout<<"\nEnter a string, or just press enter to finish:\n";
        gets(stroka[i]);
        if(stroka[i][0]=='\0') break;
        else tcopy(stroka[i]);
    }
    for(int i=0;i<99;i++){
        if(stroka[i][0]=='\0') break;
        printf("%s\n",stroka[i]);
    }
    system("pause");
    return 0;
}
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.02.2018, 21:50 7
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
int k=0;
* * char str[128];
* * str[0]='\0';
* * char *word=strtok(stroka," ");
* * while(word!=NULL)
* * {
* * * * if (k>=2) {strcat(str,word);strcat(str," ");}
* * * * word=strtok(NULL," ");
* * * * ++k;
* * }
* * strcpy(stroka,str);
Ё****й п*****ц, н*****а всё это? Меня ща стошнит, я еще понимаю ТС написал, он хотябы совета спрашивает, а ты то куда с этом г****м лезешь?

Добавлено через 5 минут
eNerGy3, КулХацкеръ, еще сократил код 19 строк
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstring>
 
void ltrim(char *s)
{
    int count = 0;
    char *pos = s;
    while (count != 2 && *pos)
        count += *pos++ == ' ';
    strcpy(s, pos);
}
 
int main()
{
    char *s = new char[20];
    strcpy(s, "asdf asdf sadsd");
    ltrim(s);
    std::cout << s << std::endl;
}
0
705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
10.02.2018, 21:52 8
Какой нежный, его ща стошнит...
Я же четко сказал - написано на основе программы ТС.
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
10.02.2018, 22:00  [ТС] 9
Тут строка инициализирована. А нам нужно вводить с клавиатуры, количество строк нужно указывать. По условию: строк <=20, а символов <=128. Вот тут загвоздка.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.02.2018, 22:48 10
Цитата Сообщение от eNerGy3 Посмотреть сообщение
По условию: строк <=20, а символов <=128. Вот тут загвоздка.
C++
1
2
3
4
5
char storage[20][128];
/// ...
std::cin >> storage[7];
/// ...
ltrim(storage[7]);
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
10.02.2018, 23:27  [ТС] 11
"cin", сохраняет текст до первого пробела. Нужна другая команда.
Пример введенного текста:
qqq www eee rrrr
ggggg ddd aaaa gggg hhhh
hhh nnn mmmm
Т.е сохраняем, именно строки со всеми символами. А потом в каждой строке, убираем первые два слова.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.02.2018, 23:36 12
eNerGy3,
C++
1
std::getline(std::cin, storage[7]);
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
11.02.2018, 00:06  [ТС] 13
К сожалению не работает
error: no matching function for call to 'getline(std::istream&, int&)'|
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
11.02.2018, 01:15 14
eNerGy3, http://en.cppreference.com/w/c... ng/getline
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
11.02.2018, 02:07  [ТС] 15
Разобрался. Немного по другому сделал(cin.getline(str[i],128))
Остался последний вопрос это копирование слов в двумерный массив.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
11.02.2018, 02:42 16
eNerGy3,
Цитата Сообщение от eNerGy3 Посмотреть сообщение
копирование слов в двумерный массив
делаешь указатель на указатель байт. char ** Я уже давал ответ выше

Цитата Сообщение от outoftime Посмотреть сообщение
char storage[20][128];
можно еще динамический создать
C++
1
2
3
char **storage = new char*[20];
for (size_t i = 0; i < 20; ++i)
    storage[i] = new char[128];
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
11.02.2018, 03:08  [ТС] 17
Не так выразился. Имел в виду про функцию tcopy.Чтобы она могла работать с двумерным массивом. Попробую сегодня днем. Засиделся уже.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
11.02.2018, 03:15 18
Цитата Сообщение от eNerGy3 Посмотреть сообщение
Не так выразился. Имел в виду про функцию tcopy.
Ругаться буду! Ты читаешь код? Твой tcopy делает в точности тоже что и мой код, только жрет больше памяти и делает кучу ненужных телодвижений.
C++
1
2
3
4
5
6
7
8
void ltrim(char *s)
{
    int count = 0;
    char *pos = s;
    while (count != 2 && *pos)
        count += *pos++ == ' ';
    strcpy(s, pos);
}
Цитата Сообщение от eNerGy3 Посмотреть сообщение
Чтобы она могла работать с двумерным массивом.
Двумерный массив.. Да это просто массив байт строк. Работаешь ты скаждой строкой в отдельности. Прошел циклом и все дела.
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 87
04.03.2018, 13:05  [ТС] 19
Доброго дня.
Показал данную лабу, сделанную своим способом, где идет обработка по строкам(ввод-вывод) не засчитали.
нужно сперва ввести весь текст(строки), а потом их все обработать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void work(char mass[][128],int n)
{
    int k=0,i=0,j=0,word=0;
    char *str=strtok(mass[i]," ");
    char arr[20][128]= {'\0'};
    char buf[20][128]= {'\0'};
        for (int i=0; i<n; i++)
        {while (str!=NULL)
        {
            if(k>=2)
            {
                strcat(buf[i],str);
                strcat(buf[i]," ");
            }
            str=strtok(NULL," ");
            k++;
        }
        strcpy(arr[i], buf[i]);
        printf(buf[i]);
        }printf("%s",arr[i]);
Почему в buf[i] записывается только первая строка?
0
04.03.2018, 13:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2018, 13:05
Помогаю со студенческими работами здесь

Сформировать два новых массива из 20-ти первых и из 20-ти последних элементов исходного массива, деленных на max
С помощью функции Random сформировать двумерный массив размером n*m вещественных чисел с элементами...

Расширить два первых числа до формата слова и записать следом за исходными числами
Помогите пожалуйста,только начинаю разбираться, был вроде как не правильный код, я исправил. И...

Удалить из исходного массива три первых элемента, сдвигая элементы массива, напечатать их значения
Помогите с созданием программы, которая выполняет следующие действия: 1) Одномерный массив из 10...

Удалить пять первых нечетных элементов массива. Добавить в конец массива три новых нулевых элемента
Удалить пять первых нечетных элементов массива. Добавить в конец массива три новых нулевых...

Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых с
Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1...

Массив: вывести два первых столбца массива
Написать com-программу, которая позволит ввести двумерный массив 4х5. И вывести из него только два...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru