В регулярном случае, вам нужно сравнить строки с помощью алгоритма сравнения струнный следующим образом:
if(strcmp(test, "etc") == 0) {
...
}
Однако, что интересно, если строки могут быть однозначно определены первые 4 байта и вы хотите более оптимизированный переключатель, вы можете делать трюки, как это:
#include <Windows.h>
#include <stdio.h>
int main(void)
{
LPSTR test = "etc";
switch(*(DWORD *)test) {
case 'cte':
puts("etc case");
break;
default:
puts("not hit");
break;
}
return ERROR_SUCCESS;
}
печатается etc case
на консоль, потому что мы берем указатель на строку и рассматривать его как DWORD
указатель. Затем указатель разыменовывается как таковой и сравнивается с значением строки DWORD
. В этом случае строка длиной всего 3 символа, но если мы рассмотрим нулевой ограничитель на конце, ее можно однозначно идентифицировать по ее первым 4 байтам.
Примечание. Следует отметить, что этот трюк работает только на архитектурах, которые обеспечивают неравномерный доступ к памяти. Причина в том, что, возможно, строка не может быть выровнена по DWORD.
Это неопределенное поведение: вы не имеете гарантии, что первый байт массива символов, где 'тест 'указывает на выравнивание по DWORD. Эта операция разыменования может вызвать исключение UNALIGNED. Дальше это не должно работать с большой конечной машиной, не так ли? – harper
Чтобы облегчить ваши проблемы с выравниванием, '* (WORD *) (test + 1) == 'ct' && * (WORD *) (test) == 'te'' будет оценивать значение true. Тривиально 'test + 1' и' test' не могут быть скорректированы с помощью WORD :) Система абстрагирует неровный доступ. См. Здесь для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/aa290049(v=vs.71).aspx. Фактически, именно поэтому неприглаженный доступ в цикле - такой убийца производительности! –
Кроме того, Windows работает только на небольших конечных машинах: http://support.microsoft.com/kb/102025 и http://blogs.msdn.com/b/larryosterman/archive/2005/06/07/426334.aspx –