Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Yar
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
#1

Глюк при вызове strcat. - C++

17.10.2009, 06:13. Просмотров 2993. Ответов 9
Метки нет (Все метки)

Здравствуйте.
Програмка должна объединять две строки в одну и сохранять в файле.
при запуске проги выскакивает отладчик, но я увы не силён в асемблере.
закоментированием строк пришёл к тому, что что-то не так делаю с strcat.
смотрел в книге (начальный курс с и с++) и в webe (народ обсуждает тонкости
работы, до которых как видно из кода я ещё не добрался).
что я делаю не так?

код и результат компиляции ниже.

код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <stdio.h>
#include <string>
 
int _tmain(int argc, _TCHAR* argv[])
{
char* ch1 = new char[100];
char* ch2 = new char[100];
 
FILE *FileOut=fopen("Out.txt","w");
 
ch1 = "qwe\0";
ch2 = "rty\0";
 
strcat (ch1,"\n");
 
fputs(ch1,FileOut);
fputs(ch2,FileOut);
 
fclose(FileOut);
 
     return 0;
}
результат компиляции:
1>------ Rebuild All started: Project: RWF, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'RWF', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>RWF.cpp
1>d:\_v_\_current_\_progs_\readwritefile\rwf\rwf\rwf.cpp(10) : warning C4996: 'fopen' was declared deprecated
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1> Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>d:\_v_\_current_\_progs_\readwritefile\rwf\rwf\rwf.cpp(15) : warning C4996: 'strcat' was declared deprecated
1> c:\program files\microsoft visual studio 8\vc\include\string.h(78) : see declaration of 'strcat'
1> Message: 'This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>Compiling manifest to resources...
1>Linking...
1>LINK : D:\_V_\_CURRENT_\_PROGS_\ReadWriteFile\RWF\Debug\RWF.exe not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>Build log was saved at "file://d:\_V_\_CURRENT_\_PROGS_\ReadWriteFile\RWF\RWF\Debug\BuildLog.htm"
1>RWF - 0 error(s), 2 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========


пробовал перевести СОКРАТОМ предупреждения. ?!?!?!?... получилоь не очень или верней ОЧЕНЬ НЕ...
Заранее спасибо всем кто откликнется.....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2009, 06:13     Глюк при вызове strcat.
Посмотрите здесь:

Непонятный глюк при дебаге - C++
Курсор стоял на 200-й строке, я добавил Buffer в Watch и сразу вылезло окно call stack.

Глюк при заполнении массива - C++
Заполняю массив float row float j=0; for (int i=0;i&lt;501;i++) { row=j; cout&lt;&lt;j&lt;&lt;endl; j += 0.02; ...

Ошибка при вызове деструктора - C++
Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм. Если же оставляю, то куча всяких...

Что происходит при вызове? - C++
class A { ... }; void f(A &amp;a) { ... } A a; ...

Ошибка при вызове CreateThread - C++ Builder
Всем привет! Есть функция: DWORD __stdcall TmainForm::OpenPic(LPVOID lpParameter) В кнопке пытаюсь запустить её в потоке: ...

Проблемы при вызове деструктора - C++
В процессе работы программы указатель на класс Dictionary,который является членом класса DictionaryManager,должен указывать на разные...

Ошибка при вызове деструктора - C++
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый главный класс - Order. Выбивает ошибку в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
17.10.2009, 09:17     Глюк при вызове strcat. #2
так попробуй, только у меню вижуал, попроавь под свои нужды
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//#include "stdafx.h"
#include <stdio.h>
#include <string>
 
int main()
{
    char ch1[100]= "qwe" ;
    char ch2[100]= "rty";
 
    FILE *FileOut=fopen("Out.txt","w");
 
 
    strcat(ch1,"\n");
 
    fputs(ch1,FileOut);
    fputs(ch2,FileOut);
 
    fclose(FileOut);
    return 0;
}
Nick Alte
Эксперт С++
1628 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,931
Завершенные тесты: 1
17.10.2009, 11:56     Глюк при вызове strcat. #3
Ты в принципе всё так делаешь, и программа строится успешно. Тебе просто выдают предупреждение об использовании функций, небезопасных в смысле переполнения буфера. Просто не обращай внимания на эти предупреждения или в самом начале файла напиши строчку
C++
1
#define _CRT_SECURE_NO_DEPRECATE
чтобы их заглушить.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
17.10.2009, 12:01     Глюк при вызове strcat. #4
Yar,
в строчках 11-12 у тебя происходит потеря (утечка) ранее выделенной памяти, в 15 - запись строки в область константных данных
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
17.10.2009, 18:01     Глюк при вызове strcat. #5
Используй улучшенную версию, вместо strcat используй strcat_s
C++
1
strcat_s(ch1, 5, "\n");
Yar
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
17.10.2009, 23:16  [ТС]     Глюк при вызове strcat. #6
если просто закоментировать //#include "stdafx.h", то не компилится.
выдаёт: fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? - это, что, я не могу использовать strcat в Win32 Console Application?
сделал EmptyProject и вставил туда код проги ---> скомпилилось, но Out.txt пустой.
исправил вызов strcat(ch1,ch2) - Out.txt всё равно пустой.
Вместо strcat(ch1,ch2) попробовал strcat_s(ch1,5,ch2) - Out.txt всё равно пустой.
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
18.10.2009, 01:46     Глюк при вызове strcat. #7
Цитата Сообщение от Yar Посмотреть сообщение
если просто закоментировать //#include "stdafx.h", то не компилится.
выдаёт: fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? - это, что, я не могу использовать strcat в Win32 Console Application?
сделал EmptyProject и вставил туда код проги ---> скомпилилось, но Out.txt пустой.
исправил вызов strcat(ch1,ch2) - Out.txt всё равно пустой.
Вместо strcat(ch1,ch2) попробовал strcat_s(ch1,5,ch2) - Out.txt всё равно пустой.
Надо в настройках проекта Compile->Use PreCompiledHeader изменить к не использованию и затем закоментировать строку #include "stdafx.h"
Yar
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
19.10.2009, 01:21  [ТС]     Глюк при вызове strcat. #8
NightmareCode - спасибо за подсказку. Выключил PreCompiledHeader. Компиляция прошла успешно.
но, УВЫ, всё равно вываливаетя в отладчик. Сегодня уже хотел было плюнуть на эту функцию, но
ведь как тоже она работает. Очень интригует, чтоже я не так делаю????

пытался ещё просмотреть др. настройки проекта. может там где-то собачка порылась?
единственное, что вызвало ещё подозрение Character Set,
но это если я правильно понял, влияет лиш на правильность ввода/вывода символов (используемый тип кодировки).

Добавлено через 48 минут
Решил попробовать: а как на счёт других функций из string.h
Вместо strcat попробовал использовать strcpy (ch1,"111");
!!!! компиляция - успешно, при запуске - вываливается в отладчик !!!!
что бы это могло быть???
Yar
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
20.10.2009, 01:14  [ТС]     Глюк при вызове strcat. #9
Получилось... но не так как ожидал и не так как описано в хелпе:
1) при создании проекта если выбрать Create directory for solution, то strcat и strcpy на отрез отказывались работать (по крайней мере у меня).
2) некоторая странность с типами операндов.
char dst[20] = "qwe"; //в хелпе сказано, что должно быть оъявление char *dst
char* src= new char[20];//в хелпе - const char *src
src= "rty";
strcat(dst,src);

Почему если dst объявить как char* dst= new char[20];,
и присвоить какое-нибудь значение, то вываливается в отладчик, хотя при компиляции ошибок не выдаёт?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2009, 13:01     Глюк при вызове strcat.
Еще ссылки по теме:

Ошибка при вызове WSARecv - C++
Добрый день. Пытаюсь написать TCP клиент, но после реконнекта от сервера иногда возникают ошибки. Открываю сокет так: ...

Ошибка при вызове деструктора - C++
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include &lt;conio.h&gt; #include &lt;iostream&gt; #include...

Ошибка при вызове деструктора - C++
По окончании программы выдает ошибку #include &lt;string.h&gt; #include &lt;iostream&gt; using namespace std; class nik //объявление...

Ошибка при вызове метода - C++
Не пойму в чем ошибка... #include &lt;vector&gt; #include &lt;iostream&gt; template &lt;typename T&gt; class Beast { public: int x; ...

Ошибка при вызове деструктора - C++
Программа компилиться нормально,но после выполнения system(&quot;pause&quot;); выползает непонятное окно,и указывает на ошибку в деструкторе.В чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
28.10.2009, 13:01     Глюк при вызове strcat. #10
Цитата Сообщение от Yar Посмотреть сообщение
Получилось... но не так как ожидал и не так как описано в хелпе:
1) при создании проекта если выбрать Create directory for solution, то strcat и strcpy на отрез отказывались работать (по крайней мере у меня).
2) некоторая странность с типами операндов.
char dst[20] = "qwe"; //в хелпе сказано, что должно быть оъявление char *dst
char* src= new char[20];//в хелпе - const char *src
src= "rty";
strcat(dst,src);

Почему если dst объявить как char* dst= new char[20];,
и присвоить какое-нибудь значение, то вываливается в отладчик, хотя при компиляции ошибок не выдаёт?
При динамической выделении памяти оператором new или new[] необходимо также после использования данного объекта или массива объектов под которые выделена динамическая память удалять операторами delete(для одиночного объекта) или delete[](для массива).
В твоем случае:
C++
1
2
3
4
char *src=new char[20];
//код где используется данный указатель src
//После использования указателя на массив символов
delete [] src;
Yandex
Объявления
28.10.2009, 13:01     Глюк при вызове strcat.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru