Правильный ответ на этот вопрос заключается в том, что этот вопрос продемонстрирует навык, которым плохо обладать.Они хотят, чтобы вы продемонстрировали способность писать хакерский код.Они хотят, чтобы вы изобрели собственную реализацию вещей, предоставляемых уже каждым компилятором C, что является пустой тратой времени.Они хотят, чтобы вы написали оптимизированный код, который по определению не читается.Реализация в 15 строк, вероятно, будет лучше, если она будет более читабельной.Большинство проектов не терпят неудачу, потому что разработчики потратили 150 тактов.Некоторые терпят неудачу, потому что кто-то написал не поддерживаемый код.Если бы вам пришлось написать это, вам понадобится 15-строчный комментарий.Таким образом, мой ответ на этот вопрос будет таким: покажите мне показатели производительности, которые защищают от необходимости не использовать стандартные библиотеки и требующие наиболее оптимального решения.Намного лучше потратить время на разработку и сбор этих показателей производительности.
Никогда не забывайте - вы также проводите собеседование с ними.
//assuming szA contains "first string" and szB contains "second string"
//and both are null terminated
// iterate over A until you get to null, then iterate over B and add to the end of A
// and then add null termination to A
// WARNING: memory corruption likely if either string is not NULL terminated
// WARNING: memory corruption likely if the storage buffer for A was not allocated large
// enough for A to store all of B's data
// Justification: Performance metric XXX has shown this optimization is needed
for(int i=0; szA[i]!='\0'; i++);
for(int j=0; (j==0)||(szB[j-1]!='\0'); j++) szA[i+j] = szB[j];
* edit, 9/27/2010
После прочтения некоторых других решений этой проблемы, я думаю, что следующий ответ, вероятно, является лучшим ответом на код:
//Posted by Doug in answer below this one
void my_strcat(char * dest, const char * src)
{
while (*dest) ++dest;
while (*dest++ = *src++);
}
Но я хотел бы дополнить его безопасной версией:
void my_safe_strcat(char * dest, const unsigned int max_size, const char * src)
{
int characters_used=0;
while (*dest) { ++dest; characters_used++; }
while ( (characters_used < (max_size-1) ) && (*dest++ = *src++) ) characters_used++;
*dest = 0; //ensure we end with a null
}
И добавьте (полный ответ, какой компилятор будет оптимизирован так, как указано выше, вместе с приложением, которое было реальным вопросом):
void my_readable_safe_strcat(char * dest, const unsigned int max_size, const char * src)
{
unsigned int characters_used = 0;
while (*dest != '\0')
{
++dest;
characters_used++;
}
while ( (characters_used < (max_size-1) ) && (*dest = *src) )
{
dest++;
src++;
characters_used++;
}
*dest = 0; //ensure we end with a null
}
int _tmain(int argc, _TCHAR* argv[])
{
char szTooShort[15] = "First String";
char szLongEnough[50] = "First String";
char szClean[] = "Second String";
char szDirty[5] = {'f','g','h','i','j'};
my_readable_safe_strcat(szTooShort,15,szClean);
printf("This string should be cut off:\n%s\n\n",szTooShort);
my_readable_safe_strcat(szLongEnough,50,szClean);
printf("This string should be complete:\n%s\n\n",szLongEnough);
my_readable_safe_strcat(szLongEnough,50,szDirty);
printf("This string probably has junk data in it, but shouldn't crash the app:\n%s\n\n",szLongEnough);
}