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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Yar
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
17.10.2009, 06:13     Глюк при вызове strcat. #1
Здравствуйте.
Програмка должна объединять две строки в одну и сохранять в файле.
при запуске проги выскакивает отладчик, но я увы не силён в асемблере.
закоментированием строк пришёл к тому, что что-то не так делаю с 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 ==========


пробовал перевести СОКРАТОМ предупреждения. ?!?!?!?... получилоь не очень или верней ОЧЕНЬ НЕ...
Заранее спасибо всем кто откликнется.....
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 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
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
17.10.2009, 11:56     Глюк при вызове strcat. #3
Ты в принципе всё так делаешь, и программа строится успешно. Тебе просто выдают предупреждение об использовании функций, небезопасных в смысле переполнения буфера. Просто не обращай внимания на эти предупреждения или в самом начале файла напиши строчку
C++
1
#define _CRT_SECURE_NO_DEPRECATE
чтобы их заглушить.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 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.
Еще ссылки по теме:

C++ Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
C++ Глюк печатания и глюк порчи константы
C++ Ошибка при вызове деструктора
C++ Исключения при вызове throw
C++ Ошибка при вызове функции

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

Или воспользуйтесь поиском по форуму:
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.
Ответ Создать тему
Опции темы

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