假设两个字符串在C中完全相同,除了其中一个字符串在空终止符之前的末尾有一个'\ n'。如果我们尝试使用strcmp来查看两个字符串是否相同,strcmp会将它们匹配为相同或不同吗?
如果它不匹配,我们如何解决这个问题并忽略'\ n'?
答案 0 :(得分:1)
不,它不会,只有精确的等号匹配strcmp()
实际上,strcmp()
执行一个操作,它可能会返回一个正值或负值,具体取决于两个字符串之间的差异,它返回0
当它们完全相同时,即
说出你strcmp(A, B) == 0
,然后字符串 A 中的每个字符都与字符串 B 中的每个字符位于完全相同的位置。
答案 1 :(得分:1)
他们不匹配。
有许多情况,一个或多个\n
在字符串的开头或结尾处。
最灵活的方法是在比较之前修剪(剥离)两个弦。见this answer
对于简单的情况,以下可能有效。基于 strcmp 实现。它最后允许多个\n
,并且可以轻松修改以修剪其他字符,例如\r
或\t
,但在strcmp_lf("1234\n", "1234\n\n1234")
等情况下失败}
static int is_strend(const char a){
if (a == '\0') return 1;
if (a == '\n') return 1;
//if (a == '\t') return 1;
//if (a == '\r') return 1;
return 0;
}
int strcmp_lf(const char *s1, const char *s2)
{
for ( ; *s1 == *s2 || (is_strend(*s1) && is_strend(*s2)); s1++, s2++)
if (*s1 == '\0' || *s2 == '\0')
return 0;
return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
}
答案 2 :(得分:0)
strcmp
检查确切的身份。除'\0'
之外的任何字符都是字符串的一部分。
一个简单的解决方案当然只是用\n
覆盖\0
,然后调用strcmp
。但是如果你不允许在那时修改字符串,
这是一种方法,它保留了strcmp的字典顺序:
size_t len1 = strlen(str1);
size_t len2 = strlen(str2);
if ( len1 == len2 + 1 && str1[len1 - 1] == '\n' && 0 == memcmp(str1, str2, len1) )
return 0;
if ( len2 == len1 + 1 && str2[len2 - 1] == '\n' && 0 == memcmp(str1, str2, len2) )
return 0;
return strcmp(str1, str2);