如果一个人有一个' \ n'那么C会匹配两个字符串吗?但另一个不是吗?

时间:2015-02-11 03:11:39

标签: c string strcmp

假设两个字符串在C中完全相同,除了其中一个字符串在空终止符之前的末尾有一个'\ n'。如果我们尝试使用strcmp来查看两个字符串是否相同,strcmp会将它们匹配为相同或不同吗?

如果它不匹配,我们如何解决这个问题并忽略'\ n'?

3 个答案:

答案 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);