У меня есть пара strcmp для получения логического значения, и все они работают нормально, за исключением случаев, когда строка содержит акцент.
if(strcmp(arrayOfStrings[index], "Día de descanso") == 0
Выводит false вместо true. Я пытался сравнить с помощью escape-последовательностей, но не могу заставить его работать.
Строки добавляются в arrayOfStrings с помощью следующей функции:
void introducirPlan()
{
for(int i = 1; i <= 10; i++)
{
printf("Actividad del dia %d? ", i);
scanf(" %[^\n]", diasEntrenamiento[i]);
}
printf("\n");
}
Есть еще одна функция для проверки строк, добавленных с помощью strcmp:
bool compararDescanso(int idia)
{
if(strcmp(diasEntrenamiento[idia], "Día de descanso") == 0)
{
return true;
}
if(strcmp(diasEntrenamiento[idia], "Dia de descanso") == 0)
{
return true;
}
}
Похоже, что здесь strcmp выводит false:
while(cntImprEntr <= 10)
{
if(compararDescanso(cntImprEntr) == true)
{
printf(" D "); /*"D" never gets printed if string contains accent */
columna++;
dia++;
}
else
{
printf(" C ");
columna++;
dia++;
}
if(columna == 5)
{
printf("|");
}
printf(" ");
cntImprEntr++;
if(columna >= 7)
{
printf("\n");
columna = 0;
}
}
Есть ли способ заставить strcmp не игнорировать акцент и выдавать истинный вывод? Когда строка внутри индекса содержит «Dia» вместо «Día», все работает нормально. Спасибо
strcmp()
. Существуют разные способы представления символов с диакритическими знаками в UTF-8 — иногда как один составной символ (одна кодовая точка), иногда как базовый символ с акцентом в качестве модификатора (с использованием двух кодовых точек). Две такие строки, показывающие один и тот же глиф, не будут сравниваться равными. Вы также должны знать, в каком кодовом наборе вы работаете. Но хорошим началом будет недвусмысленный дамп двух строк, которые, по вашему мнению, должны быть равны. - person Jonathan Leffler   schedule 15.01.2018-finput-charset=
(для кодировки символов исходного кода) и опция-fexec-charset=
(для кодировки исполняемых символов). Вам также может понадобиться настроить терминал на правильную локаль и вызватьsetlocale
, хотяstrcmp
не заботится о локали. - person Ian Abbott   schedule 15.01.2018