字符串比较是应用程序不可分割的一部分,我们会深入研究如何比较字符串,因为不正确的比较会产生误导或无效结果,理解字符串的比较能帮助你避开不正确的操作。这种认识能让你触类旁通。
比较字符串的标准方法是用strcmp
函数,原型如下:
int strcmp(const char *s1, const char *s2);
要比较的两个字符串都以指向char
常量的指针的形式传递,这让我们可以放心地使用这个函数,而不用担心传入的字符串被修改。这个函数返回以下三种值之一。
- 负数
如果按字典序(字母序)s1
比s2
小就返回负数。 - 0
如果两个字符串相等就返回0。 - 正数
如果按字典序s1
比s2
大就返回正数。
正数和负数返回值对于按字母序对字符串进行排序很有用,使用这个函数判断相等性的用法如下所示。用户的输入存储在command
中,然后跟字符串字面量比较:
char command[16];
printf("Enter a Command: ");
scanf("%s", command);
if (strcmp(command, "Quit") == 0) {
printf("The command was Quit");
} else {
printf("The command was not Quit");
}
本例的内存分配见下图。
比较两个字符串有几种不正确的写法,第一种试图用赋值操作符作比较,如下:
char command[16];
printf("Enter a Command: ");
scanf("%s",command);
if(command = "Quit") {
...
首先,这不是作比较,其次,这样会导致类型不兼容的语法错误,我们不能把字符串字面量地址赋给数组名字。在本例中,我们试图把字符串字面量的地址(也就是600)赋给command
。command
是数组,不用数组下标就把一个值赋给这个变量是不可能的。
另一种方法是用相等操作符:
char command[16];
printf("Enter a Command: ");
scanf("%s",command);
if(command == "Quit") {
...
这样会得到假,因为我们比较的是command
的地址(300)和字符串字面量的地址(600)。相等操作符比较的是地址,而不是地址中的内容,用数组名字或者字符串字面量就会返回地址。