logo
курсач

6.Сравнение строк.

При работе со строками часто возникает необходимость их сравнения в алфавитном порядке. Простейший способ состоит в сравнении кодов символов, что при наличии последовательного кодирования латинских букв и цифр дает гарантию их алфавитного упорядочения (цифры, прописные латинские, строчные латинские). Так, например, работает стандартная функция strcmp.

//---- Сравнение строк по значениям кодов

int my_strcmp(unsigned char s1[],unsigned char s2[]) {

for ( int n=0; s1[n]!='\0' && s2[n]!='\0'; n++)

if (s1[n] != s2[n]) break;

if (s1[n] == s2[n]) return 0;

if (s1[n] < s2[n]) return -1;

return 1; }

Обратите внимание на то, что массивы символов указаны как беззнаковые. В противном случае коды с весом более 0x80 (символы кириллицы) будут иметь отрицательные значения и располагаться в алфавите «раньше» латинских, имеющих положительные значения кодов. Чтобы установить свой порядок следования символов в алфавите, символы расставляют в порядке убывания их «весов» и использовать порядковый номер символа в последовательности в качестве характеристики его «веса».

//---- Сравнение строк с заданными "весами" символов

int Carry(char c){

static char ORD[] = "АаБбВвГгДдЕе1234567890";

if (c=='\0') return 0;

for ( int n=0; ORD[n]!='\0'; n++)

if (ORD[n]==c) return n;

return n+1; }

int my_strcmp(char s1[],char s2[]){

int n; char c1,c2;

for (n=0; (c1=Carry(s1[n]))!='\0' &&(c2=Carry(s2[n]))!='\0'; n++)

if (c1 != c2) break;

if (c1 == c2) return 0;

if (c1 < c2) return -1;

return 1; }