C语言处理字符串的7个函数( 三 )


1.strcmp()的返回值
【C语言处理字符串的7个函数】如果strcmp()比较的字符串不同 , 它会返回什么值?请看程序compback.c的程序示例 。
/* compback.c -- strcmp returns */#include <stdio.h>#include <string.h>int main(void){printf("strcmp("A", "A") is ");printf("%dn", strcmp("A", "A"));printf("strcmp("A", "B") is ");printf("%dn", strcmp("A", "B"));printf("strcmp("B", "A") is ");printf("%dn", strcmp("B", "A"));printf("strcmp("C", "A") is ");printf("%dn", strcmp("C", "A"));printf("strcmp("Z", "a") is ");printf("%dn", strcmp("Z", "a"));printf("strcmp("Apples", "apple") is ");printf("%dn", strcmp("apples", "apple"));return 0;}在我们的系统中运行该程序 , 输出如下:

strcmp("A", "A") is 0
strcmp("A", "B") is -1
strcmp("B", "A") is 1
strcmp("C", "A") is 1
strcmp("Z", "a") is -1
strcmp("apples", "apple") is 1
strcmp()比较"A"和本身 , 返回0;比较"A"和"B" , 返回-1;比较"B"和"A" , 返回1 。这说明 , 如果在字母表中第1个字符串位于第2个字符串前面 , strcmp()中就返回负数;反之 , strcmp()则返回正数 。所以 , strcmp()比较"C"和"A" , 返回1 。其他系统可能返回2 , 即两者的ASCII码之差 。ASCII标准规定 , 在字母表中 , 如果第1个字符串在第2个字符串前面 , strcmp()返回一个负数;如果两个字符串相同 , strcmp()返回0;如果第1个字符串在第2个字符串后面 , strcmp()返回正数 。然而 , 返回的具体值取决于实现 。例如 , 下面给出在不同实现中的输出 , 该实现返回两个字符的差值:
strcmp("A", "A") is 0
strcmp("A", "B") is -1
strcmp("B", "A") is 1
strcmp("C", "A") is 2
strcmp("Z", "a") is -7
strcmp("apples", "apple") is 115
如果两个字符串开始的几个字符都相同会怎样?一般而言 , strcmp()会依次比较每个字符 , 直到发现第1对不同的字符为止 。然后 , 返回相应的值 。例如 , 在上面的最后一个例子中 , "apples"和"apple"只有最后一对字符不同("apples"的s和"apple"的空字符) 。由于空字符在ASCII中排第1 。字符s一定在它后面 , 所以strcmp()返回一个正数 。
最后一个例子表明 , strcmp()比较所有的字符 , 不只是字母 。所以 , 与其说该函数按字母顺序进行比较 , 不如说是按机器排序序列(machine collating sequence)进行比较 , 即根据字符的数值进行比较(通常都使用ASCII值) 。在ASCII中 , 大写字母在小写字母前面 , 所以strcmp("Z", "a")返回的是负值 。
大多数情况下 , strcmp()返回的具体值并不重要 , 我们只在意该值是0还是非0(即 , 比较的两个字符串是否相等) 。或者按字母排序字符串 , 在这种情况下 , 需要知道比较的结果是为正、为负还是为0 。
--------------
注意
strcmp()函数比较的是字符串 , 不是字符 , 所以其参数应该是字符串(如"apples"和"A") , 而不是字符(如'A') 。但是 , char类型实际上是整数类型 , 所以可以使用关系运算符来比较字符 。假设word是存储在char类型数组中的字符串 , ch是char类型的变量 , 下面的语句都有效:
if (strcmp(word, "quit") == 0)// use strcmp() for stringsputs("Bye!");if (ch == 'q')// use == for charsputs("Bye!");尽管如此 , 不要使用ch或'q'作为strcmp()的参数 。
--------------
程序quit_chk.c用strcmp()函数检查程序是否要停止读取输入 。
/* quit_chk.c -- beginning of some program */#include <stdio.h>#include <string.h>#define SIZE 80#define LIM 10#define STOP "quit"char * s_gets(char * st, int n);int main(void){char input[LIM][SIZE];int ct = 0;printf("Enter up to %d lines (type quit to quit):n", LIM);while (ct < LIM && s_gets(input[ct], SIZE) != NULL &&strcmp(input[ct],STOP) != 0){ct++;}printf("%d strings enteredn", ct);return 0;}char * s_gets(char * st, int n){char * ret_val;int i = 0;ret_val = fgets(st, n, stdin);if (ret_val){while (st[i] != 'n' && st[i] != '0')i++;if (st[i] == 'n')st[i] = '0';else // must have words[i] == '0'while (getchar() != 'n')continue;}return ret_val;}


推荐阅读