Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   strcpy_s, strcat, strlen вызывают Access violation (http://forum.oszone.net/showthread.php?t=172012)

crashtuak 02-04-2010 14:25 1383363

strcpy_s, strcat, strlen вызывают Access violation
 
strcpy_s, strcat, strlen вызывают Access violation. Вот код:
Код:

LPSTR readedtext="";
strcpy_s(readedtext,strlen(readedtext)+strlen(pszOutput),pszOutput);

pszOutput мы получаем из результатов работы функции.
В чем проблема?

lxa85 02-04-2010 14:41 1383383

Цитата:

Цитата crashtuak
pszOutput мы получаем из результатов работы функции. »

А сам этот код где расположен?
Может функция пытается получить результат, который она еще не сформировала?

crashtuak 02-04-2010 16:42 1383524

Нет, результат уже есть, в дебагере смотрел, все строки в наличии.
Для ясности предоставлю код программы:
Код:

#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
        LPSTR testt="";
        LPSTR testt2="qwerty";
        strcpy_s(testt,strlen(testt2)+strlen(testt),testt2);
        return 0;
}

Результат: Access violation.

Drongo 02-04-2010 17:26 1383566

crashtuak, заголовочный файл #include <cstring.h> почему не подключаешь? А так не прокатит?

Код:

#include <windows.h>
#include <cstring.h>
#include <iostream.h>
int main()
{
  char testt[30]="";
  char testt2[]="qwerty";

  strcpy(testt, testt2);
  std::cout<<"Test = "<<testt<<endl;
  int z;
  std::cin>>z;

  return 0;
}


crashtuak 02-04-2010 19:34 1383658

Drongo, твой код работает, у меня все проблемы из-за LPSTR наверно были, но мне и char пойдет. Но как оказалось, проблема у меня более глобального характера, и без полного кода никак. Вскоре я его выложу.

pva 03-04-2010 19:15 1384361

использую описание функции по ссылке:
http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx
Цитата:

Цитата crashtuak
int _tmain(int argc, _TCHAR* argv[]) { LPSTR testt=""; LPSTR testt2="qwerty"; strcpy_s(testt,strlen(testt2)+strlen(testt),testt2); return 0; } »

Код:

код
strcpy_s(testt,strlen(testt2)+strlen(testt),testt2);
должен запихать в testt, под который выделен (формально) один символ, и приравнен нулю
strlen(testt2)+strlen(testt) символов из строки testt2. Случись такое в моей голове, я бы тоже выдал access violation.
И возможно красивые мультики увидел бы...

если хочешь соединить две строки, то нужно:
1. выделить буфер необходимого размера
2. следить за переполнением буфера
Код:

unsigned const dest_size = 100;
// я невнимательно прочитал про размер - учитывает он конечный ноль или нет. Написал как будто учитывает.
TCHAR testt[dest_size] = "preamble+"; // хотя можно и из динамической памяти LPSTR testt = new char[dest_size];
LPSTR testt2 = "qwerty";
strcpy_s(testt + strlen(testt), min(dest_size - strlen(testt1), strlen(testt2)+1 /*для завершающего 0*/), testt2);
// если выделял динамически, то delete [] testt;


crashtuak 03-04-2010 22:05 1384468

Цитата:

Цитата pva
Случись такое в моей голове, я бы тоже выдал access violation. И возможно красивые мультики увидел бы... »

:laugh:
Понял, где ошибки, буду править.
pva, пока вы не указали на строку, я и не подумал, какой бред написал, у меня в самого в голове access violation из-за своей тупости полчился:)


Время: 02:56.

Время: 02:56.
© OSzone.net 2001-