строка в константный символ * - PullRequest
0 голосов
/ 12 ноября 2008

Эта строка:

strcat(query,*it);

(где *it - итератор строки)

Дает мне эту ошибку:

нет соответствующей функции для вызова `` strcat (char [200], const std :: basic_string, std :: allocator> &) `'

Я думаю, это потому, что strcat принимает char*, а *it - строку. Как мне преобразовать его из строки в char*, чтобы он работал с strcat()?

Я пробовал strcat(query,(*it).c_str()), но это просто дает мне ошибку во время выполнения.

Редактировать: извините, его следует преобразовать в const char*

Ответы [ 9 ]

7 голосов
/ 12 ноября 2008

strcat(query,(*it).c_str()) должно работать. Что за ошибка во время выполнения? Вы уверены, что query завершается нулем, прежде чем вы совершите звонок?

2 голосов
/ 12 ноября 2008

Используйте отладчик, Люк!

(* it) .c_str () Конечно, как ад должен быть допустимым аргументом для strcat, предполагая, что ваш итератор допустим, и предполагая, что запрос является строкой с нулевым символом в конце, так и должно. Самый быстрый способ узнать, кто из них плохо себя ведет, - это посмотреть, как он это делает, проверить его значения и выполнить запрос во время выполнения.

2 голосов
/ 12 ноября 2008

Переполнение буфера?

char   query[200] = {0}; // Make sure this array initialized before
                         // you start concatenating strings onto it.

for (it = vec.begin();it != vec.end();++it)
{
   if ((strlen(query) + it->length() + 1) >= 200)
   {
       logError("Buffer oveflow detected.";
       break;
   }
   strcat(query, it->c_str());
}
1 голос
/ 13 ноября 2008

Поскольку вы исключили, что query не заканчивается нулем, кажется, что единодушным является то, что проблема может быть одной из следующих:

  1. переполнение буфера - буфер, на который указывает query, недостаточно большой, чтобы иметь (*it).c_str() соединено с ним
  2. Итератор, it, недействителен. Это может произойти несколькими способами, в том числе:

    • неправильно инициализируется;
    • имеет значение someContainer.end ();
    • или контейнер был каким-то образом модифицирован, что делает недействительным существующий итератор

Вы должны быть в состоянии определить, что происходит с отладчиком. Кроме того, я уверен, что если вы разместите больше кода, который показывает, как query и it определены и используются, вы также получите здесь однозначный ответ (как это для удаленной отладки).

1 голос
/ 12 ноября 2008

Если вы уверены в длине буфера, в котором вы strcat находитесь (например, 200), лучше использовать strncat; это исключит переполнение буфера, упомянутое @Martin. Другие проверяют общую длину перед объединением ( это предварительное условие для его использования !)

Кстати, запросы обычно становятся длиннее 200 символов. Если вы не уверены в длине результирующего запроса, используйте динамическую строку, например std::string.

1 голос
/ 12 ноября 2008

Вы должны быть более точными в отношении того, какую ошибку во время выполнения вы получите. Вызов c_str() в строке должен быть правильным решением. Как всегда с strcat() и другими классическими строковыми функциями C без проверки границ, вы должны быть осторожны, чтобы не передавать его слишком долго для ввода.

0 голосов
/ 12 ноября 2008

Если приложение находится в режиме выпуска, отследите приложение, поместив окна сообщений или сгенерировав прерывание 3. (_asm int 3;) в определенных местах. И если вы поставили прерывание, то exe выдаст сообщение об отладке. Присоедините процесс к Visual Studio, чтобы отладить его. Надеюсь, что таким образом мы сможем узнать место крушения.

0 голосов
/ 12 ноября 2008

Указывает ли * на правильную строку во всех случаях? Может ли он указывать на end () в последней итерации? Или может быть контейнер, на который он указывает, был изменен, аннулируя * it.

0 голосов
/ 12 ноября 2008

Попробуйте это (я предполагаю, что ошибка во время выполнения из-за пустого / недействительного указателя):

for (...; it != str.end(); ++it)
...
   if (!it->empty())
   {
      strcat(query, it->c_str());
   }

РЕДАКТИРОВАТЬ: Извините, c_str () никогда не возвращает NULL, который я временно забыл, так что это всегда безопасно. Если, конечно, буфер запроса не является достаточно длинным, чтобы иметь возможность содержать все соединенные строки, конечно (или есть какая-то другая проблема, например, итератор за пределами .end (), контейнер, измененный во время цикла, или что-то подобное).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...