Я работаю над небольшим проектом, к которому у меня нет доступа ни к одной стандартной библиотеке C. (создание микроядра в структуре ARM с нуля. Даже printf пришлось реализовать)
В этом случае я реализовал strcmp, используя методологию Даффа.
Ниже приведен весь код.
int
strcmp ( const char *str1, const char *str2 )
{
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return *str1 - *str2;
return 0;
}
Это имело смысл; и какое-то время казалось, что он работает на тестовых примерах, пока не произойдет сбой конечной системы. Я проследил, и дело дошло до этой строчки
Сначала я подумал, что сначала увеличивается 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 ....
}
когда * программа была "k3", она возвращала "k1", а "test_libc" возвращала "perf".
Первоначальная проблема была решена путем предоставления ей «return 1», так что этот вопрос исключительно для интересов Си.
Предложение или ссылка на документацию strcmp также приветствуется. Я видел спецификацию интерфейса для IEEE