Изменить порядок слов в предложении на обратный - C (СИ)
Формулировка задачи:
ема говорит сама за себя
является строка. надо инвертировать слова копируя в другую строку.
пример:
->
я иду домой
->
домой иду я
ГЛАВНОЕ ЧТОБЫ НА ВЫХОДЕ БЫЛ СТРОКА С \ 0 В КОНЦЕ
помогите!
а то у меня получается не строка а просто вывод по частям
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
int main(void)
{
//clrscr();
char mas1[N];
char mas2[N];
int i, j, k, u;
printf("\n\tInput sentence ->\n\n\t\t");
gets(mas1);
k=strlen(mas1);
u=k;
printf("\n\tSentence with reverse words ->\n\n\t\t");
for (i=k; i>=0; i--)
if (mas1[i]==' ')
{
for (j=i+1; j<=u; j++)
printf("%c",mas1[j]);
printf("%c",' ');
u=--i;
}
for (i=0; i<=u; i++)
printf("%c",mas1[i]);
getch();
getch();
return 0;
}Решение задачи: «Изменить порядок слов в предложении на обратный»
textual
Листинг программы
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char str[1025];//Будет содержать в себе предложение
char buf[1025];//Буффер строки str
char **words;//Будет содержать в себе слова из str
char *tok;//Указатель на текущее слово в предложении
char delim[] = " .,;!&";//Разделители между словами
char chr;//Символьная переменная, для организации повторного ввода и т.д.
long nCount;//nCount - будет содержать в себе число слов
do
{
printf("Enter sentence :\n");
scanf("%[^\n]%c",str,&chr);
sprintf(buf,"%s",str);
tok = strtok(buf,delim);//Выделяем из строки 1-е слово
nCount = 0;//Обнуляем счётчик слов
while(tok)
{
nCount++;//Считаем слова
//Продолжаем выделять из строки слова
tok = strtok(NULL,delim);
}
if(nCount == 0)
printf("Input string is empty\n");
else
{
nCount = 0;
sprintf(buf,"%s",str);
//Выделяем память на подстроки со словами из str
words = (char **)malloc(nCount*sizeof(char *));
//Заново разбиваем исходную строку на слова
tok = strtok(buf,delim);//Выделяем из строки 1-е слово
while(tok)
{
//Память под подстроку со словом
words[nCount] = (char *)malloc(strlen(tok)*sizeof(char));
sprintf(words[nCount],"%s",tok);
//Продолжаем выделять из строки слова
tok = strtok(NULL,delim);
nCount++;
}
printf("Sentence with reverse words\n");
//А теперь выводим words в обратном порядке
buf[0] = '\0';//В буф будем накапливать слова в обр порядке
while(0 < (nCount--))
{
//printf("%s ",words[nCount]);
strcat(buf,words[nCount]);
strcat(buf," ");
//И удаляем память под уже не нужный нам элемент
words[nCount] = (char *)realloc(words[nCount],sizeof(char *));
}
//Снова уменьшаем память под 1 указатель
words = (char **)realloc(words, sizeof(char *));
}
printf("%s\n",buf);
printf("Enter 1 for new input\n");
scanf("%d%c",&nCount,&chr);
}
while(nCount == 1);
return 0;
}
Объяснение кода листинга программы
- Ввод предложения с использованием функции scanf.
- Выделение памяти под строку предложения (str) и буфер (buf).
- Разбиение строки предложения на слова с использованием функции strtok и выделение памяти под каждое слово (words).
- Обратный порядок слов в предложении с использованием цикла while и функции realloc для освобождения памяти.
- Вывод обратного порядка слов в предложении с использованием функции printf и функции strcat для объединения слов в строку.
- Повторный ввод с использованием цикла do-while и функции scanf для ввода числа 1.