Каковы ошибки в этой функции из вопроса об интервью Microsoft? - PullRequest
25 голосов
/ 21 сентября 2010

Мне задали этот вопрос в письменном интервью для MS:

Найдите ошибки в программе ниже, которая должна вернуть новую строку с добавленным \n.

char* AddnewlinetoString(char *s)
{
  char buffer[1024];
  strcpy(buffer,s);
  buffer[strlen(s)-1] = '\n';
  return buffer;
}

Я попытался написать код для себя и смог заставить его работать, сделав буферную переменную глобальной и получив buffer[strlen(s)] = '\n'.Но не знал, что в нем было много других ошибок.

Ответы [ 12 ]

0 голосов
/ 21 сентября 2010

Для строк в стиле C это может быть

char* // we want return a mutable string? OK
AddNewlineToString(
  const char* s // We don't need to change the original string, so it's const.
)
{
     const size_t MAX_SIZE = 1024; // if it's a mutable string,
                                   // it should have a known capacity.

     size_t len = strlen(s);
     if(len + sizeof("\n") // To avoid the magic number "2".
         > MAX_SIZE)
         return NULL; // We don't know what to do with this situation,
                      // the user will check the result and make a decision -
                      // to log, raise exception, exit(), etc.

     // static                    // We want a thread-safe result
     char* buf = new char[1024];  // so we allocate memory in the heap
                                  // and it's C-language-string but not C language :)

     memcpy(buf, s, len); // Copy terminating zero, and rewrite it later? NO.
     memcpy(buf + len, "\n", sizeof("\n")); // The compiler will do it in one action like
        // *(int16_t*)(buf + len) = *(int16_t*)"\n";
        // rather than two assignments.

     return buf;
}
0 голосов
/ 21 сентября 2010

В C ++ должно быть

std::string AddNewlineToString(const std::string& s) // pass by const reference
{
    return s + '\n'; // and let optimizer optimize memory allocations
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...