Войти

Показать полную графическую версию : strcpy_s, strcat, strlen вызывают Access violation


crashtuak
02-04-2010, 14:25
strcpy_s, strcat, strlen вызывают Access violation. Вот код:

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

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

lxa85
02-04-2010, 14:41
pszOutput мы получаем из результатов работы функции. »
А сам этот код где расположен?
Может функция пытается получить результат, который она еще не сформировала?

crashtuak
02-04-2010, 16:42
Нет, результат уже есть, в дебагере смотрел, все строки в наличии.
Для ясности предоставлю код программы:
#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
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
Drongo, твой код работает, у меня все проблемы из-за LPSTR наверно были, но мне и char пойдет. Но как оказалось, проблема у меня более глобального характера, и без полного кода никак. Вскоре я его выложу.

pva
03-04-2010, 19:15
использую описание функции по ссылке:
http://msdn.microsoft.com/en-us/library/td1esda9%28VS.80%29.aspx
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
Случись такое в моей голове, я бы тоже выдал access violation. И возможно красивые мультики увидел бы... » :laugh:
Понял, где ошибки, буду править.
pva, пока вы не указали на строку, я и не подумал, какой бред написал, у меня в самого в голове access violation из-за своей тупости полчился:)




© OSzone.net 2001-2012