Я работаю над небольшим проектом, в котором у меня нет доступа к какой-либо стандартной библиотеке C (создание микроядра в структуре ARM с нуля. Даже printf пришлось реализовать)
В этом случае я реализовал strcmp, используя машинную методологию Даффа.
ниже приведен весь код.
int
strcmp ( const char *str1, const char *str2 )
{
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return *str1 - *str2;
return 0;
}
Это имело смысл; и какое-то время казалось, что это работает на тестовых примерах, пока не произошел сбой конечной системы. Я проследил вниз и пришел к этому strcmp.
Сначала я подумал, что сначала увеличивается str1, а затем сравнивается с str2 ДО увеличения str2. <сильный>1. Оказалось, что это не так, но кто-нибудь может подтвердить, что это может происходить в некоторых случаях?
Затем я решил, что проблема была в *str1 - *str2, поэтому изменил его, чтобы он возвращал 1. т. е. результирующий код выглядит следующим образом:
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return 1;
return 0;
в то время как все, что я хотел, это проверка «равно», поэтому изменение на «1» не вызвало проблем, но я все еще удивляюсь, почему исходный код не сработал. <сильный>2. Может ли кто-нибудь подсказать или подсказать, как это могло потерпеть неудачу? Я бы предпочел, чтобы strcmp следовал стандартному интерфейсу C, возвращая ненулевое значение, которое больше говорит о str1 и str2.
тестовые случаи были:
code_t // a function pointer type
program_find ( char *program )
{
if (strcmp( program, "exit" ) == 0) return ....
else if (strcmp( program, "k1" ) == 0) return ....
else if (strcmp( program, "k3" ) == 0) return ....
else if (strcmp( program, "perf" ) == 0) return ....
else if (strcmp( program, "test_libc" ) == 0) return ....
}
когда *program была "k3", она возвращала "k1", а "test_libc" возвращала "perf".
Первоначальная проблема была решена путем предоставления ей «возврата 1», поэтому этот вопрос касается исключительно интересов C. Также приветствуется предложение или ссылка на документацию strcmp. Я видел спецификацию интерфейса для IEEE
string.h
можно найти здесь: pdclib.rootdirectory.de /trac.fcgi/browser/trunk/functions/ - person Christoph   schedule 17.10.2011