logo search
курсач

5. Стандартные приемы обработки строк.

Большинство программ, обрабатывающих строки, используют последовательный просмотр символ за символом – посимвольный просмотр строки. Если же в процессе обработки строки предполагается изменение ее содержимого, то возможны два варианта:

Обработка символов с учетом особенностей их кодирования.

Некоторые программы используют свойства упорядоченности значений кодов латинских букв и цифр. Такое программирование является, по большому счету, машинно-зависимым, но ввиду «незыблемости» стандарта представления символов может быть отнесено к языку.

Получить символ десятичной цифры из значения целой переменной, лежащей в диапазоне 0..9:

int n; char c; c = n + '0';

Получить символ шестнадцатеричной цифры из значения целой переменной, лежащей в диапазоне 0..15:

if (n <=9) c = n + '0'; else c = n - 10 + 'A';

Получить значение целой переменной из символа десятичной цифры:

if (c >='0' && c <='9') n = c - '0';

Получить значение целой переменной из шестнадцатеричной цифры:

if (c >='0' && c <='9') n = c - '0';

else

if (c >='A' && c <='F') c = c - 'A' + 10;

Преобразовать маленькую латинскую букву в большую:

if (c >='a' && c <='z') c = c - 'a' + 'A';

Подсчет количества слов.

Нужно учесть, что программа не умеет просто «видеть слово», для нее необходимо формальное условие его обнаружения. Таковым может быть либо конец слова, либо его начало. Начало слова обнаруживается по сочетанию пары символов: текущий – символ слова (не пробел), перед которым либо пробел, либо – начало строки.

//--- Подсчет количества слов

int words(char c[]) {

for ( int nc=0,i=0;c[i]!=0;i++){ // Посимвольный просмотр строки

if (c[i]!=' ' && (i==0 || c[i-1]==' ')) nc++;

// начало слова - не пробел, начало строки или впереди пробел

// if (c[i]!=' ' && (c[i+1]==0 || c[i+1]==' ')) nc++;

// конец слова - не пробел, далее - конец строки или пробел

}

return nc; }

Удаление лишних пробелов.

Здесь уместно напомнить одно правило: количество индексов определяет количество независимых перемещений по массивам (степеней свободы). Если для входной строки индекс может изменяться в заголовке цикла посимвольного просмотра (равномерное «движение» по строке), то для выходной строки он меняется только в моменты добавления очередного символа. Кроме того, не нужно забывать «закрывать» выходную строку символом конца строки.

Удаление лишних пробелов при посимвольном переписывании

void nospace(char c1[],char c2[]) {

for ( int j=0,i=0;c1[i]!=0;i++) { // Посимвольный просмотр строки

if (c1[i]!=' ') { // Текущий символ не пробел

if (i!=0 && c1[i-1]==' ') // Первый в слове -

c2[j++]=' '; // добавить пробел

c2[j++]=c1[i]; // Перенести символ слова

} } // в выходную строку

c2[j]=0; }