[英]comparing strings with “<” or “>” operators (C)
我试着理解C中的以下操作是否存在已定义的行为:
char *str1 = "some string";
char *str2 = "another string";
if (*str1 > *str2)
//do something...
else
//do something else...
(如标题中所述,我的意思是使用“>”运算符的字符串之间的“比较”)
显然,如果我会尝试:
str1 > str2
(没有*运算符)
它会根据指针(即字符串的地址)计算结果(右..?)。 我搜索了它的答案,但没有找到任何答案,我也没有成功通过播放代码来理解它。 谢谢。
使用间接运算符*
您实际上是在解除引用时比较指针指向的字符值。
所以在你的代码中,它将's'
与'a'
进行比较,如下's' > 'a'
,这是真的。
这些值具有char
类型,因此很好地定义了使用<
, >
==
, >=
, <=
, !=
运算符。
在声明指向字符串文字的指针时要小心,使用const
限定符来防止意外修改它,因为这是未定义的。
在C中,没有“字符串类型”,只是指向由空字节终止的char
序列的char
char *
被称为“字符串”的约定。
要比较字符串内容,请使用strcmp(const char * lhs,const char * rhs) 。
*str1 > *str2
不比较字符串,它比较它们的第一个字符。
str1 > str2
没有任何比较的字符串,而它确实在很多平台上“比较他们的地址”,严格来说,它是不确定的行为 。
从C标准,6.5.8关系运算符(包括>
),第5段,强调我的:
比较两个指针时,结果取决于指向的对象的地址空间中的相对位置。 如果指向对象或不完整类型的两个指针都指向同一个对象 ,或者两个指针都指向同 一个数组对象的最后一个元素,则它们相等。
如果指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针比指向结构中先前声明的成员的指针大,指向具有较大下标值的数组元素的指针比指向同一数组的元素的指针大。具有较低的下标值。
指向同一个union对象的成员的所有指针都比较相等。 如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比较大于P.
在所有其他情况下,行为未定义。
如果没有*
运算符,您实际上是在比较str1
和str2
的地址 ,这会导致未定义的行为,因为它们不是指向同一聚合对象或联合或对象的指针。
随着*
运营商,但是,取消引用它们的地址,这样你就比较有什么变成两个字符串文字的第一个元素的值 。 在此代码中,没有未定义的行为。
"some string"
和"another string"
是字符串文字。 它们具有相应的字符数组类型char[12]
和char[15]
在这个声明中
char *str1 = "some string";
char *str2 = "another string";
指针str1
和str2
由字符串文字的第一个字符的地址初始化。
你想要的是比较这些字符串文字,这是存储在字符数组中的两个字符串。
如果你写
if (*str1 > *str2)
//do something...
那么*str1
和*str2
只是字符串文字的第一个字符。 这是if语句中的条件比较两个字符。 它等同于以下声明
if (str1[0] > str2[0])
//do something...
数组没有像<,<=,>或> =这样的关系运算符。 如果要比较两个数组,则必须分别比较它们的元素。
但是对于包含字符串的字符数组(字符序列以零结尾),有标准函数,如strcmp
, strncmp
,在header <string.h>
声明的memcmp
例如(C标准,7.23.4.2 strcmp函数)
3 strcmp函数返回一个大于,等于或小于零的整数,因为s1指向的字符串大于,等于或小于s2指向的字符串。
因此,如果您想确定第一个字符串文字是否大于您应该编写的第二个字符串文字
if ( strcmp( str1, str2 ) > 0 )
//do something...
如果要确定第一个字符串文字是否大于或等于您应该编写的第二个字符串文字
if ( strcmp( str1, str2 ) >= 0 )
//do something...
如果要确定第一个字符串文字是否小于您应该编写的第二个字符串文字
if ( strcmp( str1, str2 ) < 0 )
//do something...
如果要确定第一个字符串文字是否小于或等于您应该编写的第二个字符串文字
if ( strcmp( str1, str2 ) <= 0 )
//do something...
你无法比较两个字符串,如两个整数。 为此,您可以使用strcmp(char *firstStr, char *secondStr)
。 strcmp
的返回值是一个整数。
char *str1 = "some string";
char *str2 = "another string";
int difference;
difference = strcmp(str1,str2);
if(difference < 0)
{
printf("str1 is less than str2");
}
else if(difference > 0)
{
printf("str2 is less than str1");
}
else if (!difference) //(difference == 0)
{
printf("str1 is equal to str2");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.