Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_Kurs_Lekt / C_II_семестр / 08-2_Файлы_строки_пример

.pdf
Скачиваний:
10
Добавлен:
13.02.2016
Размер:
46.56 Кб
Скачать

Лысый Д.А. Основы программирования. Файлы. Примеры

1

/* Лысый Д.А. Пример разбивêи предложения на слова и êопирования слов в массив óêазателей Вариант с фиêсированным êоличеством óêазателей - 30. Необходимо "доработать" число óêазателей должно определятся êоличеством слов в предложении - для дневных

ãрóпп*/

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> void main () {

int i, n, dl, dlslv; char s[300]={'\0'}; char *slv[30], *sn, *sk;

//*slv[30] массив óêазателей для хранения слов

//*sn, *sk - óêазатели на строêó (на начало, êонец фраãмента) clrscr();

puts("Введите предложение êоторое состоит из слов, разделенных пробелами"); puts("число слов от 1 до 30");

fgets(s,300, stdin);

/* Проверêа - ввел пользователь строêó? */

if ((dl=strlen(s))==0) {puts("строêа нóлевой длины"); return;}

//Разбиваем фразó на слова

n=0; // число слов sn=&s[0];

do { // раз строêа не нóлевая - хотя бы одно слово есть n++;

// Ищем пробел (разделитель). Если не найден то êонец слова - êонец строêи. if ( (sk=strchr(sn, ' ')) == NULL)

{ sk=&s[dl]; dlslv=(strlen(sn)-strlen(sk)+1);} else

dlslv=(strlen(sn)-strlen(sk)); //выделяем память для найденноãо слова

slv[n-1]=(char *)calloc(dlslv+1,sizeof(char) ); // dlslv + 1 - для '\0'

//êопирóем слово из фразы в массив óêазателей memcpy( slv[n-1], sn, dlslv);

//и завершаем слово "нóлем"

slv[n-1][dlslv+1]='\0';

printf("%d -е слово: %s\n", n, slv[n-1]); sn=sk+1; // перемещаем óêазатель на следóющее слово

// начало новоãо слова за последним пробелом

}

while(!(sk==&s[dl])); // достиãли êонец предложения printf("Всеãо %d слов\n",n);

while (!kbhit()); //ждем нажатия êлавиш

}

// Подсчет числа вхождений êаждоãо символа в строêó #include <stdio.h>

#include <conio.h> #include <string.h> void main () {

/* num - хранит число вхождений êаждоãо символа в строêó. индеêс в массиве соответствóет ASCII êодó символа. */ int num[256], i, dl;

unsigned char strok[255]={'\0'}; clrscr();

puts("Введите предложение"); fgets(strok,255, stdin);

/* Проверêа - ввел пользователь строêó? */

if ((dl=strlen(strok))==0) {puts("строêа нóлевой длины"); return;} for( i=0; i<256; i++ )

num[i] = 0;

for( i=0; strok[i]; i++ ) num[ (int) strok[i] ]++;

//Все! подсчитали

//Выводим начиная с пробела (ASCII = 32 <=> 0x20) for( i=0x20; i<256; i++ ) {

if( num[i] < 1 ) continue; // Нóлевые вхождения символов пропóсêаем printf( "%c - %d раз(а)\n", (unsigned char)i, num[i] );

};

while (!kbhit()); //ждем нажатия êлавиш

}

Лысый Д.А. Основы программирования. Файлы. Примеры

2

/* Лысый Д.А.

Пример

разбивêи предложения на слова и êопирования

слов в массив óêазателей. Вариант с выделением памяти под óêазатели на слова строãо по êоличествó слов - для вечерних ãрóпп*/

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> void main () {

int i, n, dl, dlslv; char s[300]={'\0'}; char **slv, *sn, *sk;

//**slv массив óêазателей для хранения слов

//*sn, *sk - óêазатели на строêó (на начало, êонец фраãмента)

//n - число слов, dlslv - длина теêóщеãо слова

clrscr();

puts("Введите предложение êоторое состоит из слов, разделенных пробелами");

puts("число слов от 1 до 30"); fgets(s,300, stdin);

/* Проверêа - ввел пользователь строêó? */

if ((dl=strlen(s))==0) {puts("строêа нóлевой длины"); return;} // ПОдсчитываем число слов, чтобы выделить память под óêазатели. n=0; // число слов

sn=&s[0]; //поисê с начала строêи while(1) {

n++; // раз строêа не нóлевая - хотя бы одно слово есть

if ( (sk=strchr(sn, ' ')) == NULL) break; // достиãли êонец пред-

ложения

sn=sk+1; // сдвиãаемся на следóющее слово за разделителем

}

//Выделяем память под óêазатели на слова (n хранит число слов) slv=(char **)calloc(n, sizeof(char *));

//Разбиваем фразó на слова

sn=&s[0];

i=0; // теêóщее слово

do { // раз строêа не нóлевая - хотя бы одно слово есть

//Ищем пробел (разделитель). Если не найден то

//êонец слова - êонец строêи.

if ( (sk=strchr(sn, ' ')) == NULL)

{ sk=&s[dl]; dlslv=(strlen(sn)-strlen(sk)+1); } else

dlslv=(strlen(sn)-strlen(sk));

//выделяем память для найденноãо слова (по числó бóêв + под '\0') // dlslv + 1 - для '\0'

slv[i]=(char *)calloc(dlslv+1,sizeof(char) ); // dlslv + 1 - для

'\0' // êопирóем слово из предложения в массив óêазателей

memcpy( slv[i], sn, dlslv);

slv[i][dlslv+1]='\0'; // и завершаем слово "нóлем" printf("%d - е слово: %s\n", i+1, slv[i]);

i++;

sn=sk+1; // перемещаем óêазатель на следóющее слово

// начало новоãо слова за последним найденым пробелом

}

while(!(sk==&s[dl])); // достиãли êонец предложения printf("Всеãо %d слов(а)\n",n);

while (!kbhit()); //ждем нажатия êлавиш

}