Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
toni_bel
4 / 4 / 0
Регистрация: 26.07.2016
Сообщений: 96
#1

Поменять выбранные пользователем слова местами и вывести измененную строку - C (СИ)

22.09.2016, 20:55. Просмотров 249. Ответов 11
Метки нет (Все метки)

дана строка слов, необходимо поменять выбранные пользователем слова местами и вывести измененную строку с сохранением количества и местонахождения пробелов в строке.
Я пока преобразовал строку в двумерный массив, где каждое новое слово выводится с новой строки и поменял строки местами.
Проблема осталась в том, чтобы после преобразования, при выводе строки пробелы сохранились на тех же местах и в тех же количествах.
Подскажите как разобраться с пробелами.
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
37
38
39
40
41
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main()
{
    system("chcp 1251");
    system("cls");
    char s[150],b[100][250],a[150][150];
    char *x[150];
    int i=0,j=0,m,n;
    printf("ввод элементов строки\n");
    gets(s);
        while(i<strlen(s))
       if(isalpha(s[i])) 
       { m=0;
           while(isalpha(s[i]))  
           {b[j][m]=s[i];
            i++;
            m++;
           }
        j++;
       }
     else i++;
         printf("вывод строки в виде двумерного массива\n");
      for(i=0;i<j;i++)
      puts(b[i]);
          char temp;
      for(i=0;i<j;i++)
      for(m=0;m<n;m++)
      {temp=b[1][m];
      b[1][m]=b[3][m];
      b[3][m]=temp;
      }
         printf("вывод  двумерного массива после замены слов местами\n");
          for(i=0;i<j;i++)
      puts(a[i]);
    fflush(stdin);
    
return 0;
}
Добавлено через 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
for (i=0;i<strlen(s);i++)
     {n=0;
        
         if(isalpha(s[i])||s[i]=='1')
           {
            while(s[i]=='1')
            {
            a[j][n]=s[i];
            i++;
            n++;
            }
            
            while(isalpha(s[i]))
            {
            a[j][n]=s[i];
            i++;
            n++;
           }
           j++;
           
           }
         
    }
Но при вводе такой строки:
11as11ds
выводит следующее:
11as1ds
получается, что одна единица съедается при переходе на новую строку при j++. как с этого можно избежать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2016, 20:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Поменять выбранные пользователем слова местами и вывести измененную строку (C (СИ)):

Определить число вхождений указанного пользователем слова в строку текста, введённого пользователем. - C (СИ)
Определить число вхождений указанного пользователем слова в строку текста, введённого пользователем на классическом С Скажите в чем я...

Как вывести на экран последнюю букву слова, измененную на следующую букву (по алфавиту)? - C (СИ)
Как вывести на экран последнюю букву слова, измененную на следующую букву (по алфавиту)? То есть было &quot;c&quot; стало &quot;d&quot; #include &lt;stdio.h&gt;...

Поменять в матрице местами строку с максимальным элементом и строку, содержащую min элемент - C (СИ)
// 1=Указатели. Поменять местами строки.cpp : Defines the entry point for the console application. // A - динамичсекий массив. Необходимо...

Определить число вхождений указанного пользователем слова в строку текста - C (СИ)
Данная программа находит в строке самое длинное и самое короткое слово. Как в программу дописать еще: &quot;Определить число вхождений...

Поменять местами слова в строке - C (СИ)
В каждой строке текста поменять местами самое длинное и самое короткое слово. Максимум находит правильно, но вот я не понимаю, как...

Перевернуть слова и поменять местами - C (СИ)
2. Написать программу, которая сначала переворачивает слова (разделенные пробелами) в веденной пользователем строке, а потом меняет их...

11
Serega911
11 / 11 / 3
Регистрация: 24.01.2016
Сообщений: 41
23.09.2016, 15:05 #2
Зачем разбивать на двумерный массив? Два слова разбивают строку на 5 частей (с учетом этих двух слов). Достаточно только выстроить части в нужном порядке.
Написал бегом, особо не тестил. Но такая концепция, думаю, имеет право на жизнь.

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
37
38
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
int main()
{   
    char str[] = " please, swap  any    2 words in this   string   !";   
    char* firstWord = "swap";
    char* secondWord = "please";
    
    char* firstWordBegin = strstr(str, firstWord);
    char* secondWordBegin = strstr(str, secondWord);
 
    if (firstWordBegin > secondWordBegin)
    {
        char* tmp = firstWord;
        firstWord = secondWord;
        secondWord = tmp;
        
        firstWordBegin = strstr(str, firstWord);
        secondWordBegin = strstr(str, secondWord);
    }
 
    char* resultString = (char*)malloc(strlen(str));
    
    strncat(resultString, str,                                firstWordBegin-str);   
    strncat(resultString, secondWord,                         strlen(secondWord));
    strncat(resultString, firstWordBegin + strlen(firstWord), secondWordBegin - firstWordBegin - strlen(firstWord)); 
    strncat(resultString, firstWord,                          strlen(firstWord));
    strcat( resultString,  secondWordBegin + strlen(secondWord));
    
    printf("|%s|\n",str);
    printf("|%s|\n",resultString);
    
    free(resultString);
    
    return 0;
}
0
toni_bel
4 / 4 / 0
Регистрация: 26.07.2016
Сообщений: 96
23.09.2016, 15:35  [ТС] #3
Через массив более понятно, да и слова для замены выбирать по счету удобнее, чем записывать все слово целиком. Да и только начал освоение данной темы и там все примеры описываются в таком виде.
0
Serega911
11 / 11 / 3
Регистрация: 24.01.2016
Сообщений: 41
23.09.2016, 17:12 #4
Ну тогда попробуй пробелы считать словами. Например: "Мама мыла раму" => "Мама" + " " + "мыла" + " " + "раму". Тогда при перестроении слов пробелы не будут затрагиваться.
0
toni_bel
4 / 4 / 0
Регистрация: 26.07.2016
Сообщений: 96
23.09.2016, 17:35  [ТС] #5
А если будет три пробела или строка начнется с нескольких пробелов такой вариант сработает?
0
Serega911
11 / 11 / 3
Регистрация: 24.01.2016
Сообщений: 41
23.09.2016, 18:25 #6
признаком перехода к новому "слову" (набор из одного или более пробелов тоже считаем словом) является смена при чтении символа пробела на любой другой и наоборот. Подправил преобразование строки в двумерный массив.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    char delim = '-';
    char prev = s[0];
    
    while(i<strlen(s))
    {
        if( (prev == delim && s[i] != delim) || (prev != delim && s[i] == delim) ) 
        {
            b[j][m] = '\0';
            prev = s[i];
            j++;
            m=0;
        }
        
        b[j][m]=s[i]; 
        m++;
        i++;    
    }
    b[j][m] = '\0';
    
    printf("вывод строки в виде двумерного массива\n");
    for(i=0;i<=j;i++)
        puts(b[i]);
Кстати, цикл для перестановки слов у меня не работает. Да и в принципе не работает. Там получается беда если слова разной длины. И переменная n непроинициализированна.
C
1
2
3
4
5
6
for(i=0;i<j;i++)
      for(m=0;m<n;m++)
      {temp=b[1][m];
      b[1][m]=b[3][m];
      b[3][m]=temp;
      }
И еще, советую оформлять код лесенкой и всегда ставить {}. А то читаемость просто ужасная!
1
toni_bel
4 / 4 / 0
Регистрация: 26.07.2016
Сообщений: 96
23.09.2016, 18:33  [ТС] #7
В цикле на замену надо исправить n на strlen(s) и тогда выполняется замена. Вчера по запарке фигню написал.
Немогли бы вы пояснить if в шестой строке?
0
Serega911
11 / 11 / 3
Регистрация: 24.01.2016
Сообщений: 41
23.09.2016, 22:11 #8
В переменной prev запоминается первый символ слова.

Если на какой-то итерации в prev хранится пробел, а s[i] - не пробел - это признак что пробелы закончились и начинается новое слово. Или если в prev не пробел, а в s[i] пробел то слово закончилось и началась последовательность пробелов. Напомню что в b[j] хранится или слово или последовательность пробелов.
1
LFC
729 / 534 / 294
Регистрация: 17.09.2015
Сообщений: 1,597
24.09.2016, 09:28 #9
Цитата Сообщение от Serega911 Посмотреть сообщение
Два слова разбивают строку на 5 частей
или на три(если первое и последнее),или на четыре(если крайнее и в середине),или на две(если слов всего два).
0
Serega911
11 / 11 / 3
Регистрация: 24.01.2016
Сообщений: 41
24.09.2016, 13:19 #10
в данном случае не важно
0
toni_bel
4 / 4 / 0
Регистрация: 26.07.2016
Сообщений: 96
25.09.2016, 09:51  [ТС] #11
Цитата Сообщение от Serega911 Посмотреть сообщение
признаком перехода к новому "слову" (набор из одного или более пробелов тоже считаем словом) является смена при чтении символа пробела на любой другой и наоборот. Подправил преобразование строки в двумерный массив.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    char delim = '-';
    char prev = s[0];
    
    while(i<strlen(s))
    {
        if( (prev == delim && s[i] != delim) || (prev != delim && s[i] == delim) ) 
        {
            b[j][m] = '\0';
            prev = s[i];
            j++;
            m=0;
        }
        
        b[j][m]=s[i]; 
        m++;
        i++;    
    }
    b[j][m] = '\0';
    
    printf("вывод строки в виде двумерного массива\n");
    for(i=0;i<=j;i++)
        puts(b[i]);
Кстати, цикл для перестановки слов у меня не работает. Да и в принципе не работает. Там получается беда если слова разной длины. И переменная n непроинициализированна.
C
1
2
3
4
5
6
for(i=0;i<j;i++)
      for(m=0;m<n;m++)
      {temp=b[1][m];
      b[1][m]=b[3][m];
      b[3][m]=temp;
      }
И еще, советую оформлять код лесенкой и всегда ставить {}. А то читаемость просто ужасная!
Программа не совсем корректно срабатывает:
если последовательность символов заканчивается словом, то программа его не выводит, а выводится все до последнего '-'
0
Serega911
11 / 11 / 3
Регистрация: 24.01.2016
Сообщений: 41
25.09.2016, 09:58 #12
ну так надо пофиксить)
0
25.09.2016, 09:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2016, 09:58
Привет! Вот еще темы с ответами:

Как поменять в строке слова местами - C (СИ)
Необходимо в строке поменять местами самое длинное и самое короткое слово, подскажите, пожалуйста, как это сделать.

Поменять местами первую и последнюю букву слова - C (СИ)
Поменять местами первую и последнюю букву слова #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; int main() { ...

Предпоследнее и последнее слова в строке поменять местами - C (СИ)
Добрый день. Помогите пожалуйста с заданием: Ввести символьную строку. Предпоследнее и последнее слова в строке поменять местами. Без...

Поменять местами первую и последнюю буквы слова - C (СИ)
Дан текст, содержащий от 2 до 30 слов, в каждом из которых от 2 до 10 латински букв; между соседними словами - не менее одного пробела....


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

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

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