Последние несколько месяцев я работаю над старшим проектом, и основным камнем преткновения в процессе разработки нашей команды стало устранение разногласий между Visual-C ++ и gcc. (Да, я знаю, что у всех нас должна была быть одна и та же среда разработки.) На данный момент все готово, но я наткнулся на небольшую ошибку, которая заставила меня задуматься, проще ли Visual-C ++ для новичков (таких как я) по конструкции.
В одном из моих заголовков есть функция, которая опирается на strtok
, чтобы разрезать строку, сделать несколько сравнений и вернуть строку с аналогичным форматом. Это работает примерно так:
int main()
{
string a, b, c;
//Do stuff with a and b.
c = get_string(a,b);
} <br /><br />
string get_string(string a, string b)
{
const char * a_ch, b_ch;
a_ch = strtok(a.c_str(),",");
b_ch = strtok(b.c_str(),",");
}
strtok
печально известен тем, что он хорош в токенизации, но в равной степени хорош в уничтожении исходной строки для токенизации. Таким образом, когда я скомпилировал это с помощью gcc и попытался сделать что-нибудь с a
или b
, я получил неожиданное поведение, так как используемый разделитель был полностью удален в строке. Вот пример на случай, если мне неясно; если я установлю a = "Jim,Bob,Mary"
и b="Grace,Soo,Hyun"
, они будут определены как a="JimBobMary"
и b="GraceSooHyun"
вместо того, чтобы оставаться такими же, как я хотел.
Однако, когда я скомпилировал это в Visual C ++, я вернул исходные строки, и программа работала нормально.
Я попытался динамически выделить память для строк и скопировать их «стандартным» способом, но единственный работающий способ - это использование malloc()
и free()
, что, как я слышал, не приветствуется в C ++. Хотя мне любопытно, реальный вопрос, который у меня возникает, заключается в следующем: почему программа работала при компиляции в VC ++, а не с gcc?
(Это один из многих конфликтов, с которыми я столкнулся при попытке сделать код кроссплатформенным.)
Заранее спасибо!
-Карлос Нуньес