У вас есть две строки, содержимое которых логического вы хотите сравнить, но их буквальное представление может отличаться.В частности, могут быть последовательности завершения линии CR / LF, вставленные в одну или обе, которые не являются значимыми для целей сравнения.Существует много способов решения этой проблемы, но один из них - определить уникальную каноническую форму для ваших строк, подготовить версии обеих строк для этой формы и сравнить результаты.В этом случае канонической формой, вероятно, будет та, которая не содержит символов CR или LF.
Самый общий способ сделать это - создать канонизированные копии ваших строк.Это объясняет случай, когда вы не можете изменить строки на месте.Например:
/*
* src - the source string
* dest - a pointer to the first element of an array that should receive the result.
* dest_size - the capacity of the destination buffer
* Returns 0 on success, -1 if the destination array has insufficient capacity
*/
int create_canonical_copy(const char src[], char dest[], size_t dest_size) {
static const char to_ignore[] = "\r\n";
const char *start = src;
size_t dest_length = 0;
int rval = 0;
while (*start) {
size_t segment_length = strcspn(start, to_ignore);
if (dest_length + segment_length + 1 >= dest_size) {
rval = -1;
break;
}
memcpy(dest + dest_length, start, segment_length);
dest_length += segment_length;
start += segment_length;
start += strspn(start, to_ignore);
}
dest[dest_length] = '\0';
return rval;
}
Вы можете использовать это так:
char tmp1[255], tmp2[255];
if (create_canonical_copy(PtrTst->cDatVonCom, tmp1, 255) != 0) {
// COMPARISON FAILS: cDatVonCom has more non-CR/LF data than szGeraeteAntwort
// can even accommodate
return -1;
} else if (create_canonical_copy(szGeraeteAntwort, tmp2, 255) != 0) {
// should not happen, given that szGeraeteAntwort's capacity is the same as tmp2's.
// If it does, then szGeraeteAntwort must not be properly terminated
assert(0);
return -1;
} else {
return strcmp(tmp1, tmp2);
}
Предполагается, что вы сравниваете строки только на равенство.Если бы вы сравнивали их и для порядка , то вы все равно могли бы использовать этот подход, но вам нужно было бы быть более внимательным, чтобы канонизировать столько данных, сколько может вместить пункт назначения, и правильно обработатьдело со слишком большими данными.