С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96

Работа функции strcat()?

17.12.2016, 15:05. Показов 2857. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с такой непонятной вещью, если считать, что
char a="abcd";
char a[]="abcd";
полностью равнозначными, тогда почему этот код работает
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char a[]="abc";
char b[]="def";
cout<<strcat(a,b);
    return 0;
}
а вот этот не работает
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char* a="abc";
char* b="def";
cout<<strcat(a,b);
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2016, 15:05
Ответы с готовыми решениями:

Работа функции strcat()
int main() { char* str = new char; strcat(str, &quot;stroka1&quot;); strcat(str, &quot;stroka2&quot;); printf(str); deletestr; } ...

Работа со strcat
Не могу понять в чем проблема. char *NazFile = new char; char *Tempo = new char; char *ImyaUrl = new char; NazFile =...

Обьясните код функции (пользовательский strcat)
Это пользовательский релиз стандартной функции strcat(). Суть моего вопроса: Объясните мне пожалуйста весь код функции mystrcat(),...

8
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2016, 15:29
Цитата Сообщение от Maximum_001 Посмотреть сообщение
полностью равнозначными
Они неравнозначны (предполагаю, что в первой строке потерялась звёздочка)

Цитата Сообщение от Maximum_001 Посмотреть сообщение
тогда почему этот код работает
Это код некорректный, и работает он только чудом

Цитата Сообщение от Maximum_001 Посмотреть сообщение
а вот этот не работает
А здесь чуда не случилось

https://www.cyberforum.ru/blogs/18334/blog97.html
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
17.12.2016, 17:11  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Это код некорректный, и работает он только чудом
И в чем же его не корректность, статью ссылку на которую вы сбросили прочитал, не корректности в коде не заметил.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2016, 17:40
Лучший ответ Сообщение было отмечено Maximum_001 как решение

Решение

Код некорректкен, потому что в strcat в качестве dst-строки должен быть подсунут буфер памяти достаточного размера. В твоём случае результат strcat'а требует зарезервированных 7 байт (с учётом хвостового нуля), а в реальности памяти под массив "a" выделено только 4 байта
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
17.12.2016, 19:28  [ТС]
Полностью согласен, но в описании функции strcat(), про это ни слова
http://cppstudio.com/post/695/

Добавлено через 55 секунд
Хотя в примере принят массив из 100 символов))), вот я и не пойму как правильно трактовать

Добавлено через 7 минут
Спасибо больше, за информацию, я так понял, что функцию strcat(), можно использовать только с массивом char'ов.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.12.2016, 19:44
Цитата Сообщение от Maximum_001 Посмотреть сообщение
а вот этот не работает
Потому что надо читать маты компилятора о char* a="abc";. В ней вы берете указатель на константу, говорите компилятору "а я говорю, не константа", программа со словами "получай, дурак!" делает попытку константу изменить... и закономерно нарывается на защиту от записи.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2016, 20:57
Цитата Сообщение от Maximum_001 Посмотреть сообщение
Полностью согласен, но в описании функции strcat(), про это ни слова
По хорошему описания надо читать в стандарте, а не на всяких непонятных сайтах. На худой конец на культурных сайтах типа http://www.cplusplus.com/reference/cstring/strcat/ Читая там, где есть описание на русском языке, с большой вероятностью огребёшь проблемы. Так что учи английский и приучай себя читать нормальные описания на английском, близкие к первоисточнику. На худой конец можно сначала почитать на русском, а потом на английском

Те, кто часто бывает в европе, могли заметить одну интересную вещь. Если в ресторане персонал умеет разговаривать на русском языке, то скорее всего ресторан отстойный. А лучшая еда продаётся в тех местах, где даже на английском не разговаривают. Т.е. там чисто для своих (а потому высокое качество), а не для туристов (которые сегодня есть, а завтра уехали). Вот с русскоязычными техническими описаниями зачастую ситуация ровно такая же
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
20.11.2020, 16:33
Подскажите пожалуйста, а функция strcat - может возвращать указатель отличный от указателя строки str1 ?
В описании вроде бы про это ничего не сказано.

Добавлено через 54 минуты
Почему то такой код вызывает ошибку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char my_char1[] = "123456";
char my_char2[] = "7899999999999999999999999999999999999999999999999998";
 
//----------------------------------------------
char* char1_point = new char[sizeof(my_char1)];
memcpy(char1_point, my_char1, sizeof(my_char1));
//----------------------------------------------
 
 
char* my_new_char_p = strcat(char1_point, my_char2);
 
cout << my_new_char_p << endl;
 
 
cout << (void*)my_new_char_p << endl; //При попытке вывести значение указателя возникает непонятная ошибка.
При этом, если кол-во символов в my_char2 - уменьшить, то все нормально работает.

Добавлено через 26 минут
Помните, что при выполнении операций с массивами символов контроль нарушения их границ не выполняется, поэтому программист должен сам позаботиться о достаточном размере массива str1, позволяющем вместить как его исходное содержимое, так и содержимое массива str2.
Я думал strcat - сама увеличивает размер буффера str1 до нужного.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
20.11.2020, 17:43
Optimus11, если вам нужно автоматическое изменение размеров буфера - используйте std::string, внутри которого это уже сделано за вас.

Добавлено через 2 минуты
В случае же если возитесь с new - вся реализация работы с перевыделением места под буфер на вас.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2020, 17:43
Помогаю со студенческими работами здесь

Для класса String перегрузить функции strcpy, strcat
Подскажите пожалуйста, не пойму само задание из Дейтела. Изучаю главу перегрузки операций. &quot;Изучите функции библиотеки...

Почему некоторые функции в роде strcat называются небезопасными?
И что даёт использование их безопасных аналогов?

Реализовать собственные функции strcat, strcpy, strcmp, strlen
Добрый день. Помогите с задачей. Необходимо реализовать собственные функции strcat, strcpy, strcmp, strlen. Для strlen реализовал, а...

Написать текст функции strcat(), "склеивающей" две текстовые строки
4. Написать текст функции strcat(), &quot;склеивающей&quot; две текстовые строки. Функция принимает указатели на две строки s1 и s2, выделяет память...

Указатели. Ошибка компиляции в функции strcat
В функции strcat(t, *A) возникает ошибка компиляции: D:\#BC2\38.c:26: warning: assignment from incompatible pointer type ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru