我正在尝试比较两个字符串,即使它们看起来相同,但我没有得到匹配。变成一个包含\ n。
的字符串所以我的问题是,是一种检查字符串是否包含'\ n'的方法吗? 我正在使用strcmp函数;
char *tempData;
char *checkThis;
tempData = "Hello \n";
checkThis = "Hello";
if(strcmp(tempData, checkThis) == 0)
{
printf("Match");
}
答案 0 :(得分:2)
您可以在比较之前剥离空白区域,然后您不需要检查'\ n'。但是你可以只比较字符串,假设这就是你想要的。
This question对于如何在C中做到这一点有一些答案。
答案 1 :(得分:2)
创建您自己的比较函数,忽略\n
或您传入的任何其他字符:
int strcmp_ignoring_char(const char* s1, const char* s2, const char ignore)
{
while ( *s1 != '\0' && *s1 != '\0' )
{
if ( *s1 == ignore )
{
s1++;
continue;
}
if ( *s2 == ignore )
{
s2++;
continue;
}
if ( *s1 != *s2 )
return *s1 > *s2 ? 1 : -1;
s1++;
s2++;
}
/* modified to account for trailing ignore chars, as per Lundin comment */
if ( *s1 == '\0' && *s2 == '\0' )
return 0;
const char* nonEmpty = *s1 == '\0' ? s2 : s1;
while ( *nonEmpty != '\0' )
if ( *nonEmpty++ != ignore )
return 1;
return 0;
}
这样你就不会扫描两次琴弦了。
您还可以创建忽略字符串的变体,而不是单个字符:
int strcmp_ignoring_char(const char* s1, const char* s2, const char* ignore)
答案 2 :(得分:0)
这是我的尝试。我试图保持MISRA-C兼容,除了C99功能。
#include <stdint.h>
#include <stdbool.h>
#include <ctype.h>
#include <stdio.h>
int8_t strcmp_ignore_space (const uint8_t* s1, const uint8_t* s2)
{
while ((*s1 != '\0') && (*s2 != '\0'))
{
bool space1 = isspace(*s1);
bool space2 = isspace(*s2);
if(space1)
{
s1++;
}
if(space2)
{
s2++;
}
if (!space1 && !space2)
{
if (*s1 != *s2)
{
break;
}
else
{
s1++;
s2++;
}
}
} // while ((*s1 != '\0') && (*s2 != '\0'))
if(*s1 != '\0') // remove trailing white spaces
{
while(isspace(*s1))
{
s1++;
}
}
if(*s2 != '\0') // remove trailing white spaces
{
while(isspace(*s2))
{
s2++;
}
}
return (int8_t)( (int16_t)*s1 - (int16_t)*s2 );
}
int main()
{
// obscure strings with various white space characters, but otherwise equal
if(strcmp_ignore_space(" He\vllo \n",
"\r He\fll o ") == 0)
{
printf("Same\n");
}
else
{
printf("Different\n");
}
return 0;
}