Считать 3 предложения из файла и вывести их в обратном порядке - C (СИ)
Формулировка задачи:
Если я правильно поняла, не только предложения должны быть в обратном порядке, но и слова в этих предложениях. То есть все слова в тексте нужно вывести в обратном порядке в виде предложений, а не в виде массива строк.
Заранее благодарю за любую помощь. Только прошу, пишите попроще, мне пока неведомы такие понятия как vector, stream и иже с ними :-)
Ребят, помогите поправить код. Помимо нужных символов выводит какие-то кракозябры. Заранее благодарю
Так лучше, но все равно какая-то лажа
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *f1;
int i,j,k;
char c;
char str[3][4][5];
if ( (f1 = fopen("d:\\1.txt", "r")) == NULL ){
printf("Can't open file\n");
exit(1); }
i=0;
j=0;
k=0;
while ( (c = fgetc(f1)) != EOF )
{if ( c == '\0' ) {i++;}
else if ( c == ' ' ) {j++;}
str[i][j][k]=c;
k++;}
for(i=2; i>=0; i--)
{
for(j=9; j>=0; j--)
{
for(k=0; k<10; k++)
{ if (str[i][j][k]!=NULL) {printf ("%c", str[i][j][k]);} }
printf ("%c", ' ');
}
printf("\n");
}
fclose(f1);
system("pause");
}#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *f1;
int i,j,k;
char c;
char str[3][4][5];
if ( (f1 = fopen("d:\\1.txt", "r")) == NULL ){
printf("Can't open file\n");
exit(1); }
i=0;
j=0;
k=0;
while ( (c = fgetc(f1)) != EOF )
{if ( c == '\0' )
{i++;
j=0;
k=0;
continue;}
else if ( c == ' ' )
{j++;
k=0;
continue;}
str[i][j][k]=c;
k++;}
for(i=2; i>=0; i--)
{
for(j=3; j>=0; j--)
{
for(k=0; k<4; k++)
{ if (str[i][j][k]!=NULL) {printf ("%c", str[i][j][k]);} }
printf ("%c", ' ');
}
printf("\n");
}
fclose(f1);
system("pause");
}Решение задачи: «Считать 3 предложения из файла и вывести их в обратном порядке»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUFF 256
static char sp[] = " ,.\r\n";
void print_rev(const char * s) {
char * t = NULL;
if (s) {
t = strtok(NULL, sp);
print_rev(t);
printf("%s ", s);
}
}
int main() {
char *sentences[3] = { 0 }, *senten = NULL;
int t, count = 0;
FILE * fp = fopen("d:\\1.txt", "r");
if (fp == NULL) {
puts("ERR: file not found");
return EXIT_FAILURE;
}
while (count < 3) {
senten = (char*) malloc(MAX_BUFF);
*senten = '\0';
fgets(senten, MAX_BUFF, fp);
sentences[count++] = senten;
}
fclose(fp);
for (t = count-1; t >= 0; --t) {
print_rev(strtok(sentences[t], sp));
free(sentences[t]);
printf("\n");
}
system("pause");
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Объявляются необходимые переменные:
sp- строка, разделяющая предложения на отдельные словаsentences- массив указателей на строки, который будет хранить предложенияsenten- указатель на строку, которая будет заполняться при чтении файлаt- счётчик, который будет использоваться в циклеcount- счётчик, который будет отслеживать количество заполненных элементов массиваsentencesfp- указатель на файл, который будет использоваться для чтения
- Проверяется, открылся ли файл
- Если файл не открылся, выводится сообщение об ошибке и программа завершается с кодом ошибки
- Пока
countменьше 3, выполняются следующие действия:- Выделяется память под строку
senten - Строка
sentenинициализируется символом новой строки - Файл считывается в
senten sentenдобавляется в массивsentencescountувеличивается на 1
- Выделяется память под строку
- Файл закрывается
- В обратном порядке (от
count-1до 0) выполняется функцияprint_revдля каждого элемента массиваsentences- Каждое предложение разделяется на отдельные слова и выводится в обратном порядке
- После вывода предложения, память под него освобождается
- Программа ожидает нажатия любой клавиши, чтобы пользователь мог увидеть результат
- Программа завершается с кодом успеха