C_Kurs_Lekt / C_II_семестр / 08-2_Файлы_строки_пример
.pdfЛысый Д.А. Основы программирования. Файлы. Примеры |
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()); //ждем нажатия êлавиш
}